Spring Gradle bootBuildImage未使用指定Docker主机报错如何解决
问题根因
Spring Boot 2.7.0 版本的 bootBuildImage 任务存在 DSL 属性绑定bug,docker 配置块内的远程主机、TLS校验、证书路径参数不会被传递到底层的Cloud Native Buildpacks构建进程。构建进程默认读取本地Docker配置,无有效配置时会直连本地默认Unix Socket /var/run/docker.sock,因此抛出连接拒绝错误。
修复方案
二选一即可:
方案一:升级Spring Boot版本(推荐)
将Spring Boot版本升级至2.7.1及以上的2.7.x正式版,该bug在2.7.1版本中已被修复。升级后修正证书路径的写法(JVM不会自动解析~为用户主目录),原有配置即可正常生效:tasks.named<BootBuildImage>("bootBuildImage") { imageName = "repository.intra.net:28082/service:${project.version}" docker { host = "tcp://dev1.docker.intra.net:2376" isTlsVerify = true certPath = "${System.getProperty("user.home")}/docker-certs/" } }方案二:不升级版本,通过环境变量传参
若暂时无法升级Spring Boot版本,无需使用docker配置块,直接给任务注入标准Docker客户端环境变量,底层构建器会自动识别这些参数连接远程主机:tasks.named<BootBuildImage>("bootBuildImage") { imageName = "repository.intra.net:28082/service:${project.version}" environment.putAll(mapOf( "DOCKER_HOST" to "tcp://dev1.docker.intra.net:2376", "DOCKER_TLS_VERIFY" to "1", "DOCKER_CERT_PATH" to "${System.getProperty("user.home")}/docker-certs/" )) }
校验方法
配置完成后执行./gradlew bootBuildImage --info,若日志中打印Using Docker host tcp://dev1.docker.intra.net:2376相关内容,即代表远程Docker配置已生效,不会再尝试连接本地Socket。
内容的提问来源于stack exchange,提问作者Sumei Su
相关产品推荐
相关产品推荐

