如何在Dockerfile中通过keyrings.google-artifactregistry-auth使用临时令牌(无需长期GCP服务账号JSON密钥)完成私有AR包的pip安装?
如何在Dockerfile中通过keyrings.google-artifactregistry-auth使用临时令牌(无需长期GCP服务账号JSON密钥)完成私有AR包的pip安装?
我目前在Docker容器中安装GCP Artifact Registry的私有Python包时,不想使用长期有效的服务账号(GSA)JSON密钥,而是希望全程使用环境凭据(ambient creds)或OIDC来完成认证,避免密钥管理的安全风险和维护成本。
现有可行方案(但依赖长期GSA密钥)
我现在用长期GSA JSON密钥的方法是可以正常工作的,具体流程如下:
构建命令
# 传入长期服务账号密钥文件到构建上下文 docker build -f "Dockerfile" \ --secret id=gcp_creds,src="gsa_key.json" .
对应的Dockerfile内容
# 我不想再依赖这种长期密钥的方式 ENV GOOGLE_APPLICATION_CREDENTIALS=/run/secrets/gcp_creds # 安装认证所需的依赖包 RUN pip install keyring keyrings.google-artifactregistry-auth COPY requirements.txt requirements.txt # 挂载密钥和缓存来执行安装 RUN --mount=type=secret,id=gcp_creds \ --mount=type=cache,target=/root/.cache \ pip install -r requirements.txt
我的核心需求
我想彻底替换掉长期GSA密钥,改用临时令牌来完成认证。同时我希望完全在Dockerfile内部完成pip安装流程,不想把Python包的构建过程放到容器外,再把产物复制进镜像的折中方案。
尝试过但失败的方法
我尝试用已激活的环境凭据或身份模拟生成临时令牌,然后传入Docker构建,但keyrings.google-artifactregistry-auth并不认可这些令牌文件:
# 先通过环境凭据或身份模拟激活目标GSA gcloud auth print-access-token > /tmp/token.json # 也试过用config-helper生成凭据:gcloud config config-helper --format="json(credential)" > /tmp/token.json # 将临时令牌作为secret传入Docker构建 docker build -f "Dockerfile" \ --secret id=gcp_creds,src="/tmp/token.json" .
已验证的可行方向(GitHub Actions场景)
后来我在GitHub Actions里用GCP官方提供的工具成功实现了这个需求,说明用临时令牌完成认证是完全可行的!具体的Actions配置如下:
- id: 'auth' name: 'auth to gcp' uses: 'google-github-actions/auth@v2' with: token_format: 'access_token' workload_identity_provider: 'projects/xxxxx/locations/global/workloadIdentityPools/github/providers/github' service_account: xxxxxxxx - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - uses: docker/build-push-action@v6 with: push: false context: '.' file: 'Dockerfile' tags: myimage:mytag load: true cache-from: type=gha,scope=localbuild cache-to: type=gha,mode=max,scope=localbuild secret-files: | gcp_creds=${{steps.auth.outputs.credentials_file_path}}
我的核心疑问
既然GitHub Actions里的GCP官方工具能生成让keyrings.google-artifactregistry-auth认可的临时凭据文件,那用gcloud CLI怎么生成符合要求的临时凭据文件呢? 也就是不需要长期GSA密钥,只用环境凭据/OIDC就能生成对应的文件,然后在Docker构建时作为secret传入,让pip能正常拉取私有AR包。
备注:内容来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

