如何读取传递给 docker build 的 --secret args 作为环境变量写入文件?

How can I read --secret args passed to docker build as environment variables to write to a file?

我正在尝试使用秘密 Buildkit 功能。我想通过环境变量而不是文件注入秘密。

我运行正在执行此构建命令

DOCKER_BUILDKIT=1 \
MYSECRET=theverysecretpassword \
docker build \
--secret id=MYSECRET \
-t myimage .

这 运行 没有问题。如果我更改我正在导出的环境变量的名称,它会失败,说找不到它 - 这让我有信心它正在正确获取环境变量。

但我不知道如何访问 Dockerfile 中的秘密。

我试过将它写入这样的文件:

# syntax=docker/dockerfile:1.4
FROM condaforge/mambaforge

RUN echo $MYSECRET > /tmp/secret

但是当我 运行 并执行到容器中并且 运行 cat /tmp/secret 文件是空的:

docker run -it --entrypoint /bin/bash myimage

我是不是做错了什么?

编辑

我找到了解决办法,但是很乱。似乎秘密只能在 运行 挂载为文件的目标中访问 - 这是正确的吗?

这行得通,但我不确定我的历史是否会保密。这安全吗?

FROM condaforge/mambaforge

SHELL ["/bin/bash", "-c"]

RUN --mount=type=secret,id=USERNAME \
    --mount=type=secret,id=PASSWORD \
    export USERNAME=$(cat /run/secrets/USERNAME) && \
    export PASSWORD=$(cat /run/secrets/PASSWORD) && \
    echo "channels:" > /root/.condarc && \
    echo "  - https://$USERNAME:$PASSWORD@zzzz.jfrog.io/zzzz/api/conda/aaaaa" >> /root/.condarc && \
    echo "  - https://$USERNAME:$PASSWORD@zzzz.jfrog.io/zzzz/api/conda/bbbbb" >> /root/.condarc

# Run commands that use /root/.condarc

# After done delete /root/.condarc. Will this prevent secrets from getting into my docker history?

此外,我以前使用新的 heredoc 语法和 COPY 写入文件,这真的很棒:

# syntax=docker/dockerfile:1.4
FROM condaforge/mambaforge

COPY <<EOF /root/.condarc
channels:
  - https://$USERNAME:$PASSWORD@zzzz.jfrog.io/zzzz/api/conda/aaaaa
  - https://$USERNAME:$PASSWORD@zzzz.jfrog.io/zzzz/api/conda/bbbbb
EOF

是否可以将 --secret arg 与 COPY 一起使用? COPY 指令能否以某种方式从 --secret args 中读取?它会更具可读性。

我建议将 .condarc 的内容写入本地文件并立即将其挂载到正确的位置。

docker build --secret id=condarc,src=.condarc .

然后在 Dockerfile 中像这样挂载它:

RUN --mount=type=secret,id=condarc,dst=/root/.condarc ...

确保您的 .dockerignore 中有本地 .condarc,以防您使用 glob 模式或点进行复制。


另请注意,如果您将安装的秘密写入另一个文件,就像您对 echo 所做的那样,并在以后的指令中使用这个新文件,它将被添加到一个层和历史记录中。在后面的指令中删除它是不安全的,如果你需要这样做,使用 echo 或类似的,确保你在相同的 运行 指令中删除它,秘密已安装。