Docker容器内Spring Boot应用Gradle插件下载失败的网络问题
解决Docker容器内Gradle依赖下载TLS/证书问题
先搞定容器网络排查环境
因为Spring应用容器启动就退出,没法直接查网络,先改启动命令让容器保持运行:
- 在
docker-compose.yml里给Spring应用服务替换启动命令:command: sleep 3600,这样容器启动后会挂住不退出 - 启动容器后,执行
docker exec -it <容器ID> /bin/bash进入容器,运行以下命令验证网络:ping google.com确认基础外网连通性curl -v https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-gradle-plugin/2.5.4/spring-boot-gradle-plugin-2.5.4.jar看HTTPS请求的TLS握手细节,定位是证书不被信任还是TLS版本不兼容
解决证书信任问题
如果curl提示证书验证失败,说明容器里缺根证书,按镜像类型补装:
- 用Debian/Ubuntu基础镜像的话,在Dockerfile加:
RUN apt-get update && apt-get install -y ca-certificates && update-ca-certificates - 用Alpine镜像的话,在Dockerfile加:
RUN apk add --no-cache ca-certificates
强制Gradle用兼容的TLS版本
要是TLS版本过低导致握手失败,给Gradle指定TLS 1.2+:
- 在项目的
gradle.properties里加:systemProp.org.gradle.jvmargs=-Dhttps.protocols=TLSv1.2,TLSv1.3 systemProp.javax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts systemProp.javax.net.ssl.trustStorePassword=changeit - 或者直接在启动Gradle的命令里加参数:
./gradlew build -Dhttps.protocols=TLSv1.2,TLSv1.3
检查Docker网络配置
- 确认Spring应用容器和数据库容器用的是同一个自定义网络,且该网络没限制外网访问
- 要是主机用了代理,得给Docker daemon配置代理:
编辑/etc/docker/daemon.json(没有就新建):
然后重启Docker:{ "proxies": { "default": { "httpProxy": "http://你的代理地址:端口", "httpsProxy": "http://你的代理地址:端口", "noProxy": "localhost,127.0.0.1,你的内网域名" } } }systemctl restart docker
临时方案:本地预下载依赖再复制到容器
如果前面的方法都没效果,先在本地把依赖下好,再打包进容器:
- 本地执行
./gradlew build --refresh-dependencies拉取所有依赖 - 在Dockerfile里加复制缓存的命令:
COPY ~/.gradle/caches /root/.gradle/caches COPY ~/.gradle/wrapper /root/.gradle/wrapper
内容的提问来源于stack exchange,提问作者Nishadi Wickramanayaka
相关产品推荐
相关产品推荐

