我们有一个用于Python包的Google Artifact注册表。身份验证是这样工作的。在本地,它运行良好。
然而,当我想构建一个需要从我们的私人注册表安装包的Docker镜像时,我如何将凭据传递给Docker构建?
当使用用户帐户或服务帐户构建时,我希望保持Dockerfile不变。
这是有效的,但我不确定这是最佳实践:
FROM python:3.9
RUN pip install keyring keyrings.google-artifactregistry-auth
COPY requirements.txt .
RUN --mount=type=secret,id=creds,target=/root/.config/gcloud/application_default_credentials.json
pip install -r requirements.txt
然后构建:
docker build --secret="id=creds,src=$HOME/.config/gcloud/application_default_credentials.json" .
在本地工作时使用keyring
非常好,但在我看来,这不是Dockerfile的最佳解决方案。这是因为您唯一的选择是在构建时装载卷(我觉得这很混乱),或者将凭据复制到Dockerfile
(我觉得不安全)。
相反,我通过在Dockerfile
中执行以下操作来实现这一点:
FROM python:3.10
ARG AUTHED_ARTIFACT_REG_URL
COPY ./requirements.txt /requirements.txt
RUN pip install --extra-index-url ${AUTHED_ARTIFACT_REG_URL} -r /requirements.txt
然后,要构建您的Dockerfile
,您可以运行:
docker build --build-arg AUTHED_ARTIFACT_REG_URL=https://oauth2accesstoken:$(gcloud auth print-access-token)@url-for-artifact-registry
虽然它似乎没有出现在Artifact Registry的官方文档中,但它可以作为使用钥匙链的替代品。请注意,gcloud auth print-access-token
生成的令牌有效期为1小时。
在docker build ...
期间访问私有资源的最安全和当前最佳实践是使用docker secrets,正如您在OP中所做的那样。
在这之后,你可能不想再使用密钥环了,所以你可以考虑卸载它,然后进行多阶段构建,以提高安全性并缩小图像大小。
也有例外,例如,如果这只是一个基本映像,并且应用程序映像将使用另一个RUN --mount
命令重用密钥环。但即使在这种情况下,出于同样的原因,最终的多阶段构建也可能有所帮助。
结果将是一个干净的python docker映像,只在单层上安装了所需的包,而没有其他生产不需要的东西,比如keyring包。