【问题标题】:How to bring credentials into a Docker container during build如何在构建期间将凭据带入 Docker 容器
【发布时间】:2016-09-29 21:30:06
【问题描述】:

我想知道在docker build 期间是否有关于如何将凭据注入 Docker 容器的最佳实践。 在我的 Dockerfile 中,我需要获取需要基本身份验证的资源网络服务器,并且我正在考虑如何将凭据带入容器而不对其进行硬编码。

.netrc 文件和curl --netrc ... 一起使用怎么样?但是安全呢?我不喜欢将凭据与我的 Dockerfile 一起保存在源存储库中的想法。

例如,是否有任何方法可以使用参数或环境变量注入凭据?

有什么想法吗?

【问题讨论】:

  • 我认为这里的这个问题是关于仅传递 build 的凭据,例如从某个 URL 获取要在构建期间解压缩的发布 zip 的凭据,not 容器运行时应用程序的凭据(上面链接的问题是关于什么的)。 ARG 适合,但凭据不安全,因为值保存在图像元数据中,并且任何拥有图像文件的人都可以通过docker history 看到。

标签: docker dockerfile docker-build


【解决方案1】:

一些新的 Docker 功能使其比过去更加优雅和安全。新的multi-phase builds 让我们用一个Dockerfile 来实现构建器模式。此方法将我们的凭据放入一个临时的“构建器”容器中,然后该容器构建一个不包含任何机密的新容器。

您可以选择如何将凭据放入构建器容器中。例如:

  • 使用环境变量:ENV creds=user:passcurl https://$creds@host.com
  • 使用build-arg 传递凭据
  • 将 ssh 密钥复制到容器中:COPY key /root/.ssh/id_rsa
  • 通过Credential Helpers 使用您的操作系统自己的安全凭据

Multi-phaseDockerfile 带有多个 FROM:

## Builder
FROM alpine:latest as builder
#
# -- insert credentials here using a method above --
#
RUN apk add --no-cache git
RUN git clone https://github.com/some/website.git /html

## Webserver without credentials
FROM nginx:stable
COPY --from=builder /html /usr/share/nginx/html

【讨论】:

  • 切勿将 COPY 与 ssh 密钥一起使用。 medium.com/@activenode/…
  • @ZigZagT,Medium 文章没有使用多阶段构建,对于单阶段构建,它是一种不安全的技术是正确的,但是对于多阶段构建,可以避免问题,如 xer0x 所示.
  • @KenWilliams 是的,你是对的。但请记住,这条评论已经有将近 4 年的历史了。单阶段构建模式在当时仍然占主导地位,因为多阶段构建太新而无法被广泛采用。在 docker hub 的公共镜像中找到 ssh 密钥并不罕见。
  • 我同意人们将凭据放入图像中的现象过于普遍,但这里的答案是正确的,并且在这种情况下永远不要使用 COPY 的警告是不正确的,就像它是 4几年前。
猜你喜欢
  • 1970-01-01
  • 2023-02-22
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多