Dockerfile中如何在同一条RUN语句内使用heredoc后执行命令?
Dockerfile同一条RUN语句中使用Heredoc并执行后续命令的解决方法
完全可行,问题出在你对RUN语句续行符和heredoc终止符的使用上。
你的原写法中,EOF后面加了反斜杠\,这会导致shell认为heredoc还未终止——heredoc的终止符EOF必须单独占据一行,且该行不能有任何多余字符(包括续行符、空格)。
调整后的正确写法如下:
FROM alpine RUN export FOO=bar && \ cat <<EOF > testfile Hello, World! EOF && \ echo $FOO
说明:
EOF单独成行,正确终止heredoc;- 后续命令
echo $FOO通过&&与前面的cat命令连接,并在&&后添加续行符\,保证整个RUN语句在同一个shell会话中执行; - 这样既保留了环境变量
FOO的生效范围,又不会额外生成镜像层,完全符合你的需求。
如果需要避免heredoc内容中的变量被Dockerfile提前解析,可以将终止符用单引号包裹(如<<'EOF'),此时heredoc内的$符号会被当作普通字符处理。
内容的提问来源于stack exchange,提问作者Hans Kilian
相关产品推荐
相关产品推荐

