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

时间:2019-01-28 08:02:46

标签: string bash docker dockerfile multiline

我想在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命令来执行此操作?

2 个答案:

答案 0 :(得分:2)

还有另一个与此类似的问题,并带有解决方案: How to write commands with multiple lines in Dockerfile while preserving the new lines?

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

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

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

有关此领先美元符号的更多信息,请点击此处: How does the leading dollar sign affect single quotes in Bash?

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

答案 1 :(得分:1)

如果文件大小适中,通常更容易将其存储在单独的文件中,只需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))。