在GitLab Runner docker执行器openjdk容器中用Gradle构建Micronaut镜像咨询
解决方案:openjdk容器内通过Gradle构建Docker镜像
宿主机Socket映射方案(优先推荐,性能更高)
此前出现的Connection reset by peer报错核心原因是容器内构建进程无Docker Socket读写权限,按以下步骤调整即可正常运行:
- 第一步:获取宿主机Docker组ID,在宿主机执行命令
getent group docker,返回结果中冒号分隔的第三段即为Docker组的GID,默认通常为999。 - 第二步:配置容器权限,可任选以下一种方式实现:
- 修改自定义gradle-runner镜像:在镜像的Dockerfile中添加如下指令,提前配置好Docker组权限
RUN groupadd -g <替换为上一步获取的宿主机Docker组GID> docker && usermod -aG docker <替换为容器内执行Gradle命令的用户名> - 临时配置CI执行权限:在
.gitlab-ci.yml对应构建步骤的脚本开头添加权限配置命令,无需修改基础镜像script: - groupadd -g <替换为宿主机Docker组GID> docker || true - usermod -aG docker <替换为容器内执行Gradle命令的用户名> # 临时排查问题可添加下方命令,验证是否为权限导致的报错,生产环境不建议使用 # - chmod 666 /var/run/docker.sock - ./gradlew dockerBuild
- 修改自定义gradle-runner镜像:在镜像的Dockerfile中添加如下指令,提前配置好Docker组权限
- 第三步:调整Gradle Docker插件连接配置,在项目根目录或对应模块的
build.gradle中添加如下配置,指定使用Unix Socket连接Docker服务:docker { url = "unix:///var/run/docker.sock" }
替代方案:DinD(Docker in Docker)模式
如果不想修改GitLab Runner的 volumes 配置,可使用DinD服务实现镜像构建,该方案无需访问宿主机Docker资源,适合共享Runner场景:
- 修改
.gitlab-ci.yml的构建任务配置,声明DinD服务和对应环境变量:java-build-job: image: openjdk:14.0.2-slim services: - name: docker:dind alias: docker variables: DOCKER_HOST: "tcp://docker:2375" DOCKER_TLS_CERTDIR: "" script: - ./gradlew dockerBuild - 调整Gradle Docker插件配置,兼容两种运行环境:
docker { url = System.getenv("DOCKER_HOST") ?: "unix:///var/run/docker.sock" }
内容的提问来源于stack exchange,提问作者Roland Tepp
相关产品推荐
相关产品推荐

