我不使用不会过期的服务帐户 json 密钥,我在任何地方都使用环境信用和 OIDC,因此我无法为 AR 生成和使用 json 密钥。
我想在我的 Dockerfile 中进行 pip 安装来安装我的私有 AR 包。
做这样的事情是有效的:
# Passing in a non expiring key
docker build -f "Dockerfile" \
--secret id=gcp_creds,src="gsa_key.json" .
##### IN DOCKERFILE
# I dont want to generate json keys like this
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=target=/root/.cache \
pip install -r requirements.txt
keyrings.google-artifactregistry-auth 是否以某种方式支持令牌?
这不起作用,例如:
# GSA is active through ambient creds or impersonation
gcloud auth print-access-token > /tmp/token.json
# also tried: gcloud config config-helper --format="json(credential)" > /tmp/token.json
docker build -f "Dockerfile" \
--secret id=gcp_creds,src="/tmp/token.json" .
我想避免采取诸如在容器外部构建并复制图像中构建的工件之类的做法。我想在 dockerfile 中进行构建。
因此,我使用 GCP 提供的 GH 操作工具来完成此操作,因此我知道可以以密钥环可接受的格式生成临时令牌。我仍然想知道如何使用 gcloud cli 在其他场景中执行此操作。
使用上面的 dockerfile 和这些 GH 操作步骤,我可以通过 OIDC 进行身份验证并生成 pip 密钥环提供商接受的信用文件:
- 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}}
通常情况下,您不需要在
Dockerfile
中设置凭据文件。相反,您可以通过 Application Default Credentials (ADC)
使用身份验证。
keyrings.google-artifactregistry-auth
软件包与 ADC
无缝协作。
例如,如果您想在本地测试您的
Dockerfile
,您可以在身份验证后将 ADC 生成的短期凭证挂载为卷。
首先,使用以下方法通过 Google Cloud 验证您的本地计算机:
gcloud auth application-default login
此命令将生成短期凭据并将其保存到 GCP 配置中的已知路径,例如:
Credentials saved to file: [/Users/current_user/.config/gcloud/application_default_credentials.json]
在 Docker 中安装凭证
运行 Docker 容器时,您可以使用以下命令将此凭证文件作为卷安装到容器中:
docker run -it \
-v $HOME/.config/gcloud:/root/.config/gcloud \
your_image
CI/CD 管道中的身份验证
在 CI/CD 管道的上下文中,例如使用
GitHub Actions
,如果您使用 Workload Identity Federation
或其他身份验证方法,则无需将凭据传递到 Dockerfile
。
容器将在当前执行上下文中自动进行身份验证。