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

GitHub Actions中Docker容器内gcloud认证失败问题咨询

GitHub Actions中Docker容器内gsutil 401认证异常问题

问题现象

在GitHub Actions工作流中完成Docker镜像构建后,在容器内执行gsutil命令访问GCP存储桶时抛出如下错误:

Run docker run ltr:latest /bin/sh -c "gsutil cat gs://test-bucket/test_file.txt"
ServiceException: 401 Anonymous caller does not have storage.objects.get access to the Google Cloud Storage object.
Error: Process completed with exit code 1.

已确认使用的服务账号拥有目标存储桶的对应访问权限,本地环境执行相同gsutil命令可正常运行,由于复现依赖GCP项目资源与GitHub Secrets存储的服务账号凭证,仅公开核心配置如下:

GitHub Actions工作流配置

name: test

on: push

jobs:

  test-gsutil-command:
    runs-on: [self-hosted, ubuntu-latest]
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Authenticate to Google Cloud
        id: auth
        uses: google-github-actions/auth@v0
        with:
          credentials_json: '${{ secrets.GCP_CREDENTIALS }}'
      - name: Set up Google Cloud SDK
        uses: google-github-actions/setup-gcloud@v0
      - name: Register gcloud as a Docker credential helper
        run: gcloud auth configure-docker
      - name: build
        run: docker build ltr:latest .
      - name: Run gcloud command in docker
        run: docker run ltr:latest /bin/sh -c "gsutil cat gs://test-bucket/test_file.txt" # 该行触发上述报错

Dockerfile配置

FROM gcr.io/deeplearning-platform-release/tf-gpu.2-8
RUN mkdir -p /ltr
COPY requirements /ltr/requirements
COPY Makefile /ltr
COPY setup.py /ltr

WORKDIR /ltr

RUN python -m pip --no-cache-dir install -r requirements/base.txt

问题根因

google-github-actions/auth 动作生成的GCP认证凭证仅保存在GitHub Actions运行器的宿主机环境,执行的gcloud auth configure-docker命令仅配置了Docker拉取GCR/AR镜像的权限,不会自动将宿主机的GCP认证信息注入到你启动的业务容器内部。容器内预装的gsutil找不到有效认证凭证,会默认以匿名身份发起请求,最终触发401无权限错误。

可行配置方案

  • 挂载宿主机gcloud配置目录(最简便)
    启动容器时将宿主机的gcloud配置目录直接挂载到容器内对应用户的gcloud配置路径,容器内的gsutil会自动读取挂载的认证信息,调整容器运行命令即可:
    docker run -v $HOME/.config/gcloud:/root/.config/gcloud ltr:latest /bin/sh -c "gsutil cat gs://test-bucket/test_file.txt"
    
    注意:如果容器内执行命令的用户不是root,需要将挂载目标路径替换为对应用户的gcloud配置目录,例如非root用户的默认路径为/home/<用户名>/.config/gcloud。
  • 通过环境变量传入服务账号凭证
    先将Secrets中存储的服务账号JSON密钥输出为运行器上的临时文件,启动容器时将密钥文件挂载进容器,同时通过GOOGLE_APPLICATION_CREDENTIALS环境变量指定容器内的凭证路径:
    1. 先在工作流中新增步骤生成临时凭证文件:
    - name: Generate temp GCP credential file
      run: echo '${{ secrets.GCP_CREDENTIALS }}' > ${{ github.workspace }}/gcp_sa_key.json
    
    1. 调整容器运行命令,挂载凭证并配置环境变量:
    - name: Run gcloud command in docker
      run: docker run -v ${{ github.workspace }}/gcp_sa_key.json:/tmp/gcp_sa_key.json -e GOOGLE_APPLICATION_CREDENTIALS=/tmp/gcp_sa_key.json ltr:latest /bin/sh -c "gsutil cat gs://test-bucket/test_file.txt"
    
  • 构建阶段写入凭证(仅临时测试可用,不推荐生产环境)
    构建镜像时通过build-arg传入服务账号凭证,在镜像构建阶段完成gcloud认证。该方式会将凭证残留在镜像层,存在凭证泄露风险,禁止用于推送到公共镜像仓库的生产镜像:
    1. 调整Dockerfile新增认证逻辑:
    FROM gcr.io/deeplearning-platform-release/tf-gpu.2-8
    # 新增认证参数与逻辑
    ARG GCP_SA_CRED
    RUN mkdir -p /ltr
    RUN echo $GCP_SA_CRED > /tmp/sa_key.json && gcloud auth activate-service-account --key-file=/tmp/sa_key.json && rm -f /tmp/sa_key.json
    # 原有逻辑保留
    COPY requirements /ltr/requirements
    COPY Makefile /ltr
    COPY setup.py /ltr
    
    WORKDIR /ltr
    
    RUN python -m pip --no-cache-dir install -r requirements/base.txt
    
    1. 调整构建命令,传入凭证参数:
    docker build --build-arg GCP_SA_CRED='${{ secrets.GCP_CREDENTIALS }}' -t ltr:latest .
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:24:25