构建Docker镜像推送GitLab容器注册表时安全克隆Git仓库的现代方法
Docker构建时克隆GitLab私有仓库的零凭证泄露方案
核心原则
所有会导致凭证固化到镜像层、残留在构建缓存、写入最终镜像的方案都直接排除,最终方案必须满足:
- 不使用长期有效凭证,所有访问凭据单次构建生效、构建结束自动失效
- 凭证不写入任何镜像层,无法通过
docker history、镜像层解压等方式提取 - 构建完成后镜像内不残留Git凭证、临时拉取的冗余仓库文件
具体实现
1. 前置配置
先打开项目A的权限配置:进入项目A的「设置」-「CI/CD」-「令牌访问」,勾选允许来自此命名空间中其他项目的CI作业令牌访问本项目。因为A、B同属一个GitLab群组,配置后B的流水线自动获得A仓库的只读权限,不需要额外创建访问令牌、配置SSH密钥。
2. 修改Dockerfile
不要用ARG传凭证、不要把密钥复制进镜像再删,直接用Docker BuildKit提供的secret挂载能力,凭证仅在克隆命令执行的瞬间临时存在:
FROM ubuntu:18.04 # 单独分层安装git,充分利用构建缓存 RUN apt-get -y update && apt-get install -y --no-install-recommends git \ && rm -rf /var/lib/apt/lists/* # 克隆私有依赖仓库A RUN --mount=type=secret,id=gitlab_token,required=true \ # 临时配置git凭证,不写入全局配置持久化 GIT_AUTH_HEADER="https://gitlab-ci-token:$(cat /run/secrets/gitlab_token)@gitlab.com/" && \ git config --global url."${GIT_AUTH_HEADER}".insteadOf "https://gitlab.com/" && \ # 浅克隆,减少拉取量、避免带入多余提交历史 git clone --depth 1 https://gitlab.com/group_name/A.git /tmp/repo_A && \ # 执行你需要的操作:比如拷贝代码、编译安装依赖 cp -r /tmp/repo_A/* /your/build/target/path/ && \ # 清理所有临时痕迹:删除拉取的仓库、还原git配置 rm -rf /tmp/repo_A && \ git config --global --unset url."${GIT_AUTH_HEADER}".insteadOf # 其余构建逻辑 [...]
说明:
/run/secrets/gitlab_token是BuildKit临时挂载的内存文件,仅在当前RUN指令运行周期内存在,指令执行结束立即卸载,不会写入任何镜像层,也不会进入构建缓存。
3. 修改.gitlab-ci.yml
开启BuildKit,直接把GitLab CI自动生成的临时作业令牌作为secret传入构建流程,不需要额外生成、管理任何凭证:
build image: image: docker:20.10.17 services: - docker:20.10.17-dind variables: # 开启BuildKit支持secret挂载 DOCKER_BUILDKIT: 1 rules: - if: $CI_PIPELINE_SOURCE == "schedule" script: # 登录GitLab容器注册表,用CI内置的临时注册表凭证 - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin # 构建时传入secret,直接取CI自动生成的单次作业令牌 - docker build \ --secret id=gitlab_token,env=CI_JOB_TOKEN \ -t $CI_REGISTRY_IMAGE . - docker push $CI_REGISTRY_IMAGE
常见错误方案避坑
- 不要用
ARG传递Git令牌/密码:ARG的值会明文记录在docker history中,任何人拿到镜像都能直接提取 - 不要先把SSH密钥/令牌复制到镜像内,克隆完再删除:密钥/令牌已经存在于上一个构建层,通过层解压就能直接拿到,删除操作只作用于当前层,不会清除历史层的内容
- 不要使用个人访问令牌、项目常驻令牌这类长期凭证:一旦泄露会长期有效,风险远高于单次流水线自动生成的
CI_JOB_TOKEN
内容的提问来源于stack exchange,提问作者Michele Peresano
相关产品推荐
相关产品推荐

