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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:57:23