当 docker-maven 插件尝试构建映像时会发生啥?
Posted
技术标签:
【中文标题】当 docker-maven 插件尝试构建映像时会发生啥?【英文标题】:What is happening when docker-maven plugin tries to build image?当 docker-maven 插件尝试构建映像时会发生什么? 【发布时间】:2016-04-17 08:36:26 【问题描述】:我在 docker 容器中运行 Jenkins,Jenkins 尝试运行我的 maven 构建。作为构建的一部分,docker maven 插件指示它构建一个 docker 映像。
POM 的那部分在下面。
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.3.8</version>
<configuration>
<imageName>example</imageName>
<baseImage>java:latest</baseImage>
<skipDockerBuild>false</skipDockerBuild>
<cmd>["java", "-jar", "myLogThread-jar-with-dependencies.jar"]</cmd>
<resources>
<resource>
<directory>target/</directory>
<include>config.properties</include>
</resource>
<resource>
<directory>$project.build.directory</directory>
<include>myLogThread-jar-with-dependencies.jar</include>
</resource>
</resources>
</configuration>
</plugin>
maven 构建会一直运行,直到它尝试构建映像,此时会吐出以下错误消息:
[INFO] Building image example
[INFO] I/O exception (java.io.IOException) caught when processing request to ->unix://localhost:80: Permission denied
我可以进入正确的目录并且 Dockerfile 在那里。
我也可以运行sudo docker build .
,它会毫无问题地构建图像。
为什么 Maven 构建失败?正在向 localhost:80 发出什么请求?我该如何纠正这个问题,以便 maven 可以构建我的图像?
注意:我已经在这个容器中安装了 docker 套接字和二进制文件
【问题讨论】:
你有没有想过这个问题?我也有同样的问题。 尝试在 /etc/default/docker 中直接添加DOCKER_OPTS=' -G jenkins'
。然后通过sudo service docker restart
重启docker服务
我在完全相同的环境下遇到了同样的问题。有谁知道解决办法吗?
【参考方案1】:
正如 Rajith Delantha 所说,这为我解决了问题:
直接在/etc/default/docker
中添加:DOCKER_OPTS=' -G jenkins'
。
然后通过sudo service docker restart
重启docker服务。
【讨论】:
【参考方案2】:这可以通过在 Jenkins 中添加 DOCKER_HOST
环境变量来解决。
像这样设置你的 docker 守护进程:
[/etc/sysconfig/docker]
OPTIONS="-H tcp://127.0.0.1:4243"
Jenkins Jobs(注入环境变量):
DOCKER_HOST=tcp://127.0.0.1:4243
【讨论】:
【参考方案3】:我有同样的问题,但在我的本地机器上。
我在 Github 线程中阅读此评论后得到它:https://github.com/docker/compose/issues/1214#issuecomment-256774629
上面写着:
解决方案(来自 https://docs.docker.com/engine/installation/linux/debian/,没有 仅适用于 Debian):
如果 docker 组不存在,请添加它。
sudo groupadd docker
将连接的用户“$USER”添加到 docker 组。更改用户 名称以匹配您的首选用户。您可能需要注销并重新登录 再次生效。
sudo gpasswd -a $USER docker
重新启动 Docker 守护程序。
sudo service docker restart
【讨论】:
【参考方案4】:在确保 docker ps
由运行 mvn
的同一用户工作后,我仍然遇到同样的问题。
由于图像名称中的特殊字符,它看起来像一个错误。我通过从 docker 映像名称中删除破折号 (-)(或任何特殊字符)来解决它。
尝试将存储库设置为不同的名称并检查。
<configuration>
<repository>somename</repository>
</configuration>
【讨论】:
【参考方案5】:我能够通过结合两个赞成答案的元素来解决问题。
设置选项以在/etc/default/docker
中使用不同的端口。
DOCKER_OPTS="-H tcp://127.0.0.1:4243"
重启 Docker 守护进程。
sudo service docker restart
然后构建你的包。
export DOCKER_HOST=tcp://127.0.0.1:4243
mvn clean package docker:build
【讨论】:
【参考方案6】:我在竹代理遇到了这个问题,但我认为詹金斯也是如此。
将运行 maven 的用户添加到 docker 组。然后重新启动 docker 和运行 maven 的服务。服务运行时不会加载组更改。所以就我而言:
sudo groupadd docker # if it does not exist
sudo usermod -a -G docker bamboo-user
sudo systemctl restart docker.service
sudo systemctl restart bamboo-agent.service
【讨论】:
【参考方案7】:当我没有运行 docker 守护程序时,我遇到了类似的问题 - 重新启动 Docker 工具箱,现在看起来更快乐了
【讨论】:
【参考方案8】:我对 Jenkins 也有同样的问题。
将 jenkins 添加到 docker 组
sudo usermod -aG docker jenkins
然后重新启动詹金斯。
【讨论】:
以上是关于当 docker-maven 插件尝试构建映像时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot Maven 插件 > 2.4.x 在 gitlab 注册表上构建映像发布
spotify/dockerfile-maven 插件:无法构建映像:javax.net.ssl.SSLException:无法识别的 SSL 消息,纯文本连接
Java 9:将自定义模块化运行时映像与第三方插件系统相结合