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会自动读取挂载的认证信息,调整容器运行命令即可:
注意:如果容器内执行命令的用户不是root,需要将挂载目标路径替换为对应用户的gcloud配置目录,例如非root用户的默认路径为docker run -v $HOME/.config/gcloud:/root/.config/gcloud ltr:latest /bin/sh -c "gsutil cat gs://test-bucket/test_file.txt"/home/<用户名>/.config/gcloud。 - 通过环境变量传入服务账号凭证
先将Secrets中存储的服务账号JSON密钥输出为运行器上的临时文件,启动容器时将密钥文件挂载进容器,同时通过GOOGLE_APPLICATION_CREDENTIALS环境变量指定容器内的凭证路径:- 先在工作流中新增步骤生成临时凭证文件:
- name: Generate temp GCP credential file run: echo '${{ secrets.GCP_CREDENTIALS }}' > ${{ github.workspace }}/gcp_sa_key.json- 调整容器运行命令,挂载凭证并配置环境变量:
- 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认证。该方式会将凭证残留在镜像层,存在凭证泄露风险,禁止用于推送到公共镜像仓库的生产镜像:- 调整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- 调整构建命令,传入凭证参数:
docker build --build-arg GCP_SA_CRED='${{ secrets.GCP_CREDENTIALS }}' -t ltr:latest .
内容的提问来源于stack exchange,提问作者lida
相关产品推荐
相关产品推荐

