如何读取传递给 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 或类似的,确保你在相同的 运行 指令中删除它,秘密已安装。
我正在尝试使用秘密 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 或类似的,确保你在相同的 运行 指令中删除它,秘密已安装。