在 dockerfile 中使用 secret

Gus*_*ría 4 docker kubernetes dockerfile docker-compose

是否可以访问 dockerfile 内的机器环境?我正在考虑将 SECRET 作为 build ARG 传递,如下所示:

码头工人组成:

version: '3.5'
services:
  service:
    ...
    build:
      ...
      args:
        SECRET: ${SECRET}
    ...
Run Code Online (Sandbox Code Playgroud)

码头档案:

FROM image
ARG SECRET
RUN script-${SECRET}

Run Code Online (Sandbox Code Playgroud)

注意:容器是在 kubernetes 中构建的,我无法将任何参数传递给构建命令或执行任何命令。

编辑 1:可以将 SECRET 作为 ARG 传递,因为这不是敏感数据。我使用SECRETS访问微服务数据,我只能使用secrets存储数据。将此视为机器环境。

编辑 2:这不是 docker 的问题,而是我正在使用的基础设施的问题,它不允许将任何参数传递给 docker 构建。

Sla*_*hin 10

秘密应该在运行时使用并由执行环境提供。

此外,在容器构建期间执行的所有内容都被记录为层,以后任何能够访问图像的人都可以使用。这就是为什么在构建过程中很难以安全的方式使用机密。

为了解决这个问题,Docker 最近引入了一个特殊的选项--secret。要使其工作,您将需要以下内容:

  1. 设置环境变量DOCKER_BUILDKIT=1

  2. --secret参数用于docker build命令

    DOCKER_BUILDKIT=1 docker build --secret id=mysecret,src=mysecret.txt...

  3. 在 Docker 文件的最顶部添加语法注释

    # syntax = docker/dockerfile:1.0-experimental

  4. 使用--mount参数为每个需要它的RUN指令挂载秘密

RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

请注意,这需要Docker 版本 18.09 或更高版本

  • 您需要设置环境变量“DOCKER_BUILDKIT=1”才能正常工作。 (2认同)

Jon*_*nas 5

ARG是一个构建时间参数。您希望将Secrets 保密,而不是将它们写入工件中。保持秘密的外部环境变量或外部文件

docker run -e SECRET_NAME=SECRET_VALUE
Run Code Online (Sandbox Code Playgroud)

在 docker-compose 中:

docker run -e SECRET_NAME=SECRET_VALUE
Run Code Online (Sandbox Code Playgroud)

或者

services:
  app-name:
    environment:
    - SECRET_NAME=YOUR_VALUE
Run Code Online (Sandbox Code Playgroud)

Kubernetes

当您在 Kubernetes 中运行完全相同的容器映像时,您从Secret对象挂载了密钥。

services:
  app-name:
    env_file:
    - secret-values.env
Run Code Online (Sandbox Code Playgroud)

  • 如果**秘密**不是_敏感数据_,为什么要使用它???否则您可以使用环境变量。 (2认同)
  • `ARG` 不是一个秘密,所以不要写它是一个秘密。如果您的 Kubernetes 中只有 Secret,则可以将它们用作_环境变量_。但在 dockerfile 中没有“秘密”,只有 _arg_ 或 _env_。 (2认同)
  • 这不是一个坏习惯吗,因为秘密稍后将在容器中作为环境变量提供?我在这里读到为什么我们不应该使用 env var 来存储秘密:https://diogomonica.com/2017/03/27/why-you-shouldnt-use-env-variables-for-secret-data/#:~ :text=%20twelve%2Dfactor%20app%20宣言,传递%20it%20以及%20your%20configs。 (2认同)

Daz*_*kin 0

是的,如果您需要在容器构建期间访问机密,则可以将机密数据作为 ARG 传递;你别无选择(!?)。

ARG 值仅在构建期间可用,因此您需要能够信任构建过程,并且在结束时会对其进行适当的清理;如果恶意行为者能够访问构建过程(或事后),它就可以访问秘密数据。

奇怪的是您希望使用该秘密,因为script-${SECRET}我假设该秘密将用于访问外部服务。有人能够从生成的 Docker 映像中确定脚本名称,这会暴露您的秘密。