使用dockerfile中的秘密

使用dockerfile中的秘密,docker,kubernetes,docker-compose,dockerfile,Docker,Kubernetes,Docker Compose,Dockerfile,是否可以访问dockerfile内部的计算机环境?我想把秘密作为build ARG传递,就像这样: docker compose: 版本:“3.5” 服务: 服务: ... 建造: ... args: 秘密:${SECRET} ... dockerfile: FROM image ARG SECRET RUN script-${SECRET} 注意:容器是在kubernetes中构建的,我不能将任何参数传递给build命令或执行任何命令 编辑1:可以将SECRET作为ARG传递,因为这不是

是否可以访问dockerfile内部的计算机环境?我想把秘密作为build ARG传递,就像这样:

docker compose:

版本:“3.5”
服务:
服务:
...
建造:
...
args:
秘密:${SECRET}
...
dockerfile:

FROM image
ARG SECRET
RUN script-${SECRET}

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

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

编辑2:这不是docker的问题,而是我使用的基础结构的问题,它不允许将任何参数传递给docker生成。

ARG
是生成时参数。您希望保持机密机密,而不是将其写入工件中。在外部环境变量或外部文件中保守秘密

在docker compose中:

服务:
应用程序名称:
环境:
-SECRET\u NAME=您的\u值

服务:
应用程序名称:
环境文件:
-secret-values.env
库伯内特斯 在Kubernetes中运行完全相同的容器映像时,从一个对象装载机密

容器:
-名称:应用程序名称
图像:应用程序图像名称
环境:
-姓名:机密名称
价值来源:
secretKeyRef:
名称:秘密对象的名称
密钥:令牌

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

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


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

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

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

为了解决这个问题,Docker最近引入了。要使其正常工作,您需要以下几点:

  • 设置环境变量DOCKER\u BUILDKIT=1

  • 将--secret参数用于docker build命令

    DOCKER\u BUILDKIT=1 DOCKER build--secret id=mysecret,src=mysecret.txt

  • 在Docker文件的最顶端添加语法注释

    #syntax=docker/dockerfile:1.0-experimental

  • 使用--mount参数为每个需要它的运行指令装载机密

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


    请注意,这需要。

    机密只有在构建完成后才可用。所以答案是否定的,秘密不能在dockerfile中使用。您可以在构建完成后使用它们,例如在运行映像时执行的入口点文件中。

    我自己无法执行构建命令,它是由kubernetes中的微服务运行的。可以将机密作为ARG传递,因为它不是敏感数据。如果它不是敏感数据,为什么要使用机密???您可以使用其他环境变量。我没有访问环境变量的权限:/
    ARG
    不是秘密,所以不要写它是秘密。如果您的Kubernetes中只有Secret,那么您可以将它们作为环境变量使用。但在dockerfile中没有“秘密”,只有arg或env。这样做不再是最佳实践。Docker现在拥有一个能够正确处理机密的系统。用于部署此Docker的环境可以有机密,但不能有环境变量。因此,其目的是像在机器环境中一样使用机密。此变量仅在生成期间使用。这可能是一个错误,但这可能是我能想到的唯一选择。您需要设置环境变量
    DOCKER\u BUILDKIT=1
    ,才能使其工作。请注意,这仅适用于Linux!这并不是真的,Slava的最高票答案显示了机密在构建期间的使用,Slava说的是真的。但是看看问题的“注释”部分。
    docker run -e SECRET_NAME=SECRET_VALUE