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。要使其工作,您将需要以下内容:
设置环境变量DOCKER_BUILDKIT=1
将--secret参数用于docker build命令
DOCKER_BUILDKIT=1 docker build --secret id=mysecret,src=mysecret.txt...
在 Docker 文件的最顶部添加语法注释
# syntax = docker/dockerfile:1.0-experimental
使用--mount参数为每个需要它的RUN指令挂载秘密
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret
请注意,这需要Docker 版本 18.09 或更高版本。
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 中运行完全相同的容器映像时,您从Secret对象挂载了密钥。
services:
app-name:
env_file:
- secret-values.env
Run Code Online (Sandbox Code Playgroud)
是的,如果您需要在容器构建期间访问机密,则可以将机密数据作为 ARG 传递;你别无选择(!?)。
ARG 值仅在构建期间可用,因此您需要能够信任构建过程,并且在结束时会对其进行适当的清理;如果恶意行为者能够访问构建过程(或事后),它就可以访问秘密数据。
奇怪的是您希望使用该秘密,因为script-${SECRET}我假设该秘密将用于访问外部服务。有人能够从生成的 Docker 映像中确定脚本名称,这会暴露您的秘密。
| 归档时间: |
|
| 查看次数: |
8389 次 |
| 最近记录: |