是否可以访问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访问微服务数据,并且只能使用机密存储数据。将此视为机器环境。
答案 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中运行完全相同的容器映像时,您将从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中使用秘密。您可以在构建完成后使用它们,例如,在运行映像时执行的入口点文件中。