在dockerfile中使用秘密

时间:2019-12-02 17:11:58

标签: docker kubernetes docker-compose dockerfile

是否可以访问dockerfile中的Docker机密?我当时想通过SECRET作为构建ARG,就像这样:

docker-compose:

version: '3.5'
services:
  service:
    ...
    build:
      ...
      args:
        SECRET: ${SECRET}
    ...

dockerfile:

FROM image
ARG SECRET
RUN script-${SECRET}

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

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

4 个答案:

答案 0 :(得分:3)

ARG build time 参数。您想保留秘密 秘密,而不要将其写在工件中。将机密保留在外部环境变量或外部文件中。

docker run -e SECRET_NAME=SECRET_VALUE

以及在docker-compose中

services:
  app-name:
    environment:
    - SECRET_NAME=YOUR_VALUE

services:
  app-name:
    env_file:
    - secret-values.env

Kubernetes

当您在Kubernetes中运行完全相同的容器映像时,您将从Secret对象安装秘密。

  containers:
  - name: app-name
    image: app-image-name
    env:
      - name: SECRET_NAME
        valueFrom:
          secretKeyRef:
            name: name-of-secret-object
            key: token

答案 1 :(得分:0)

是的,如果您需要在容器构建过程中访问机密,则将机密数据作为ARG传递;您没有(!?)替代方案。

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

很好奇,您希望将机密用作script-${SECRET},因为我认为该机密将用于访问外部服务。有人将能够从生成的Docker映像中确定脚本名称,这将揭示您的秘密。

答案 2 :(得分:0)

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

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

为了解决这个问题,Docker最近推出了a special option --secret

docker build --secret id=mysecret,src=mysecret.txt ...
RUN --mount指令一起使用的

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

答案 3 :(得分:0)

仅在构建完成后才可以使用秘密。因此,答案是“否”,无法在dockerfile中使用秘密。您可以在构建完成后使用它们,例如,在运行映像时执行的入口点文件中。

相关问题