docker-maven-plugin 构建镜像踩坑:大写字母与 docker.sock 权限问题

在使用 docker-maven-plugin 插件构建 Docker 镜像时,遇到了两个典型问题,记录排查过程与解决方案,供参考。

问题一:Connection reset by peer

错误日志

1
2
3
4
5
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.2.2:build (default-cli)
on project parkinglot: Exception caught: java.util.concurrent.ExecutionException:
com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException:
com.spotify.docker.client.shaded.org.apache.http.client.ClientProtocolException:
Cannot retry request with a non-repeatable request entity: Connection reset by peer -> [Help 1]

插件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<dependencies>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<configuration>
<imageName>oldBookShare</imageName>
<!-- 指定 Dockerfile 所在的文件目录 -->
<dockerDirectory>${project.basedir}</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>

原因分析

Docker 镜像名称不允许包含大写字母,oldBookShare 中含有大写字母,导致请求被 Docker 守护进程拒绝并重置连接。

解决方案

<imageName> 中的 oldBookShare 改为全小写的 old-book-share 即可。


问题二:Permission denied

错误日志

1
2
3
4
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.2.2:build (default-cli)
on project tomcat-container: Exception caught: java.util.concurrent.ExecutionException:
com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException:
Permission denied -> [Help 1]

原因分析

/var/run/docker.sock 是 Docker 守护进程默认监听的 UNIX 套接字文件,容器内外均可通过它与守护进程通信。默认情况下,普通用户没有该文件的读写权限。

操作系统环境:VM-20-7-debian

解决方案

第一步:查看 docker.sock 的当前权限:

1
sudo ls -al /var/run/docker.sock

输出结果如下,可以看到普通用户确实没有访问权限:

1
srw-rw---- 1 root docker 0 Dec  1 20:42 /var/run/docker.sock

第二步:修改文件权限,赋予所有用户读写权限:

1
sudo chmod 666 /var/run/docker.sock

执行后重新运行 Maven 构建命令,即可正常工作。

注意:服务器重启后 docker.sock 的权限可能会恢复默认值,届时重新执行上述命令即可。如需永久生效,可以考虑将当前用户加入 docker 用户组:

1
sudo usermod -aG docker $USER

重新登录后即可生效,无需每次手动修改权限。

参考资料:解决 docker-maven Permission denied 问题

查看评论