将Google Artifact注册表凭据注入Docker构建



我们有一个用于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包。

相关内容

  • 没有找到相关文章

最新更新