我想使用heredoc创建一个文件,然后在Dockerfile中的相同RUN语句中运行命令。
为了说明这一点,请看这个 Dockerfile
FROM alpine
RUN export FOO=bar && \
cat <<EOF > testfile
Hello, World!
EOF \
&& echo $FOO
当我尝试构建它时,它失败并显示
ERROR: failed to solve: unterminated heredoc
。
看来
EOF
必须自己在一条线上。但如果我这样做,RUN 语句就会结束,我必须将下一个命令放在新的 RUN 语句上。
我希望在同一个 RUN 语句上遵循定理文档,以最小化层数并让环境变量可用。
这可能吗?
您可以将此处文档嵌套在此处文档中。例如:
FROM alpine
RUN <<CMD_EOF
# NB. `set -e` is very important! It stops the run statement if one of the commands fails
set -ex
export FOO=bar
cat <<FILE_EOF >test_file
Hello, World!
FILE_EOF
echo $FOO
CMD_EOF
RUN cat test_file
这利用了 docker 中heredocs 的初始用例——在一个
RUN
语句中运行一系列命令,而无需使用 &&
和 \
链接它们。第一个heredoc是CMD_EOF
,其中包含您要运行的所有命令。第二个,FILE_EOF
,包含您要创建的文件的内容。