当 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:将自定义模块化运行时映像与第三方插件系统相结合

Docker 映像未使用 https 和 tomcat 运行

非法字符导致spring boot微服务构建在docker镜像创建过程中失败