You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

GitLab CI用Jib构建镜像遇环境冲突,求无自定义镜像解决方案

解决GitLab CI中Jib构建Docker镜像的环境矛盾问题

我来给你两个无需自定义镜像的解决方案,完美适配你的场景:

方案一:用Docker-in-Docker(DinD)让Maven环境访问Docker daemon

如果你坚持要用jib:dockerBuild生成镜像到本地Docker daemon,这个方案可以让maven镜像的CI job直接对接GitLab提供的Docker服务:

Building:
  image: maven:3-jdk-8
  stage: build
  only:
    - master
  services:
    - docker:19.03.1-dind
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""  # 关闭TLS验证,适配19.03版本的DinD服务
  script:
    - echo "临时安装Docker客户端到Maven环境"
    - apt-get update && apt-get install -y --no-install-recommends docker-ce-cli
    - echo "构建项目并生成镜像到DinD的Docker daemon"
    - mvn compile jib:dockerBuild
    # 后续如果要推送到GitLab仓库,可以添加docker push命令,记得用$CI_JOB_TOKEN做认证

关键细节说明:

  • services字段会启动一个独立的Docker daemon容器,你的Maven job容器可以通过tcp://docker:2375地址访问它
  • DOCKER_TLS_CERTDIR: "" 是必须的,因为19.03版本的DinD默认开启TLS,而我们在CI内部环境可以安全关闭它
  • Maven镜像默认没有Docker客户端,所以用apt-get临时安装,这一步不需要自定义镜像,直接在CI脚本里执行即可

方案二:跳过Docker daemon,用Jib直接推送镜像到GitLab仓库

这其实是Jib的核心优势之一——完全不需要依赖Docker daemon,直接构建镜像并推送到仓库,流程更简洁高效,也是我更推荐的方案:

Building:
  image: maven:3-jdk-8
  stage: build
  only:
    - master
  variables:
    GITLAB_REGISTRY: registry.gitlab.com/your-project-namespace/your-project  # 替换成你的仓库地址
    IMAGE_TAG: $CI_COMMIT_SHA  # 用提交哈希做标签,也可以改成latest或自定义版本号
  script:
    - echo "直接构建并推送镜像到GitLab仓库"
    - mvn compile jib:build -Dimage=$GITLAB_REGISTRY:$IMAGE_TAG -Djib.auth.username=gitlab-ci-token -Djib.auth.password=$CI_JOB_TOKEN

关键细节说明:

  • jib:build目标不需要任何Docker环境,Jib会直接生成镜像层并推送到指定仓库
  • $CI_JOB_TOKEN是GitLab CI自动生成的认证令牌,拥有当前项目镜像仓库的推送权限,不需要手动配置账号密码
  • 如果你想简化CI脚本,可以把镜像地址和认证信息预先配置到pom.xml的Jib插件里:
<plugin>
  <groupId>com.google.cloud.tools</groupId>
  <artifactId>jib-maven-plugin</artifactId>
  <version>3.4.0</version> <!-- 建议使用最新稳定版 -->
  <configuration>
    <image>registry.gitlab.com/your-project-namespace/your-project:${git.commit.id}</image>
    <auth>
      <username>gitlab-ci-token</username>
      <password>${ci.job.token}</password>
    </auth>
  </configuration>
</plugin>

之后CI脚本就可以简化成mvn compile jib:build,更加干净利落。

方案对比

方案一适合你需要先在本地Docker daemon验证镜像的场景,但多了Docker客户端安装和DinD服务的开销;方案二更贴合Jib的设计初衷,构建速度更快,也减少了环境依赖,是生产环境的首选。

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

火山引擎 最新活动