繁体   English   中英

如何使用单个命令在Dockerfile中输出多行字符串

[英]How to output a multiline string in Dockerfile with a single command

我想在Dockerfile中输出以下文本:

  *****first row *****  
  *****second row *****    

一种方法是这样做:

cat > Dockerfile <<EOF
FROM alpine:latest
RUN echo '  *****first row *****  ' >> /home/myfile
RUN echo '  *****second row *****  ' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home
EOF  

但是,如果我有100行,则需要时间,因为它分别运行每个命令并将其作为一个层。

其他方式是这样的:

FROM alpine:latest
RUN printf '  *****first row *****  \n  *****second row *****  \n' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home

但我不喜欢它,因为它使它的可读性降低,特别是当你有100行时。

我想知道有没有办法做这样的事情:

FROM alpine:latest
RUN echo '  *****first row *****  
            *****second row *****  ' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home

或者有没有办法使用ARG命令来做到这一点?

还有一个类似于此问题的解决方案: 如何在保留新行的同时在Dockerfile中编写多行命令?

这个问题的答案更具体地说明了如何在bash中使用多行字符串而不是如何使用Docker。

按照此解决方案,您可以完成您想要执行的操作,如下所示:

RUN echo $' \n\
*****first row ***** \n\
*****second row ***** \n\
*****third row ***** ' >> /home/myfile

有关此主要美元符号的更多信息:领先的美元符号如何影响Bash中的单引号?

请注意,此语法依赖于使用/ bin / bash的run命令,而不是/ bin / sh。

如果你有一个中等大小的文件,通常更容易将它存储在一个单独的文件中,只需COPY它。

FROM alpine:latest
COPY myfile.txt /
CMD cat /myfile.txt

这也扩展到ENTRYPOINTCMD命令。 不是编写复杂的shell命令(特别是作为ENTRYPOINT ),而是编写单独的shell脚本通常更容易。 如果您的应用程序在运行容器所做的主要内容之前打印该文件的内容很重要,那么您可以编写一个入口点脚本

#!/bin/sh
cat /myfile.txt
exec "$@"

然后是Dockerfile

FROM alpine:latest
COPY myfile.txt entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["???"]

如果实际内容需要依赖于环境变量或其他运行时数据,那么在运行主程序之前,这还为您提供了在运行时修改文件(例如,使用sed (1))的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM