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




