GitLab流水线中如何在docker:cli镜像内下载安全文件?
解决Docker:Cli镜像下无法下载GitLab安全文件的问题
问题背景
用GitLab流水线构建Docker容器时依赖docker:cli镜像,但该镜像缺少curl和bash工具,导致无法通过官方脚本下载已上传的config.json安全文件,报错提示curl和bash未找到。需要保留docker:cli镜像的同时完成认证文件的获取。
可行方案
方案1:前置任务+工件传递(推荐)
新增一个前置任务,用自带curl和bash的基础镜像下载安全文件,再通过GitLab工件传递给后续的构建任务:
# 前置任务:专门下载安全文件 download-docker-config: image: alpine:latest stage: prepare # 此阶段需在publish阶段之前 before_script: - apk add --no-cache curl bash # 安装所需工具 script: - curl -s https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer | bash - mkdir -p ./docker-auth/ - cp $SECURE_FILES_DOWNLOAD_PATH/dockerconfig.json ./docker-auth/config.json artifacts: paths: - ./docker-auth/ # 指定要传递的文件路径 expire_in: 1h # 按需设置过期时间,避免占用存储 # 原构建任务,依赖前置任务的工件 "build-docker-$[[ inputs.image ]]": image: docker:cli stage: publish services: - docker:dind needs: - download-docker-config # 明确依赖前置任务,确保工件已生成 before_script: - mkdir -p ~/.docker/ - cp ./docker-auth/config.json ~/.docker/config.json # 复制到Docker默认读取路径 # 无需再执行docker login,config.json已包含认证信息 script: # 替换成你的构建、推送命令 - docker build -t $MY_REGISTRY/your-image:$TAG . - docker push $MY_REGISTRY/your-image:$TAG
方案2:临时构建带工具的Docker镜像
如果不想用工件传递,可以在流水线里临时构建一个包含docker:cli+curl+bash的镜像,用这个临时镜像下载文件:
"build-docker-$[[ inputs.image ]]": image: docker:cli stage: publish services: - docker:dind before_script: # 编写临时Dockerfile,给docker:cli添加curl和bash - | cat > Dockerfile.tmp <<EOF FROM docker:cli RUN apk add --no-cache curl bash EOF - docker build -t docker-cli-with-tools -f Dockerfile.tmp . # 用临时容器下载安全文件,复制到当前目录 - docker run --rm -v $(pwd):/workdir docker-cli-with-tools sh -c " curl -s https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer | bash && cp \$SECURE_FILES_DOWNLOAD_PATH/dockerconfig.json /workdir/config.json " - mkdir -p ~/.docker/ - cp config.json ~/.docker/config.json script: # 执行你的构建推送操作 - docker build -t $MY_REGISTRY/your-image:$TAG . - docker push $MY_REGISTRY/your-image:$TAG
关键提示
- 工件传递时,
needs字段必须正确关联前置任务,防止构建任务提前执行。 - Docker默认读取
~/.docker/config.json作为认证配置,复制文件时要确保路径正确。 - 配置好
config.json后,无需再手动执行docker login命令。
内容的提问来源于stack exchange,提问作者jeremywat
相关产品推荐
相关产品推荐

