You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GitLab Runner docker执行器openjdk容器中用Gradle构建Micronaut镜像咨询

解决方案:openjdk容器内通过Gradle构建Docker镜像

宿主机Socket映射方案(优先推荐,性能更高)

此前出现的Connection reset by peer报错核心原因是容器内构建进程无Docker Socket读写权限,按以下步骤调整即可正常运行:

  • 第一步:获取宿主机Docker组ID,在宿主机执行命令getent group docker,返回结果中冒号分隔的第三段即为Docker组的GID,默认通常为999。
  • 第二步:配置容器权限,可任选以下一种方式实现:
    1. 修改自定义gradle-runner镜像:在镜像的Dockerfile中添加如下指令,提前配置好Docker组权限
      RUN groupadd -g <替换为上一步获取的宿主机Docker组GID> docker && usermod -aG docker <替换为容器内执行Gradle命令的用户名>
      
    2. 临时配置CI执行权限:在.gitlab-ci.yml对应构建步骤的脚本开头添加权限配置命令,无需修改基础镜像
      script:
        - groupadd -g <替换为宿主机Docker组GID> docker || true
        - usermod -aG docker <替换为容器内执行Gradle命令的用户名>
        # 临时排查问题可添加下方命令,验证是否为权限导致的报错,生产环境不建议使用
        # - chmod 666 /var/run/docker.sock
        - ./gradlew dockerBuild
      
  • 第三步:调整Gradle Docker插件连接配置,在项目根目录或对应模块的build.gradle中添加如下配置,指定使用Unix Socket连接Docker服务:
    docker {
        url = "unix:///var/run/docker.sock"
    }
    

替代方案:DinD(Docker in Docker)模式

如果不想修改GitLab Runner的 volumes 配置,可使用DinD服务实现镜像构建,该方案无需访问宿主机Docker资源,适合共享Runner场景:

  1. 修改.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
    
  2. 调整Gradle Docker插件配置,兼容两种运行环境:
    docker {
        url = System.getenv("DOCKER_HOST") ?: "unix:///var/run/docker.sock"
    }
    

内容的提问来源于stack exchange,提问作者Roland Tepp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:30:02