在 Dockerfile 中的同一个 RUN 语句中的heredoc之后运行程序

问题描述 投票:0回答:1

我想使用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 语句上遵循定理文档,以最小化层数并让环境变量可用。

这可能吗?

docker sh heredoc
1个回答
0
投票

您可以将此处文档嵌套在此处文档中。例如:

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
,包含您要创建的文件的内容。

© www.soinside.com 2019 - 2024. All rights reserved.