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

E23*_*235 2 string bash multiline docker dockerfile

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

  *****first row *****  
  *****second row *****    
Run Code Online (Sandbox Code Playgroud)

一种方法是这样做:

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  
Run Code Online (Sandbox Code Playgroud)

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

其他方式是这样的:

FROM alpine:latest
RUN printf '  *****first row *****  \n  *****second row *****  \n' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home
Run Code Online (Sandbox Code Playgroud)

但我不喜欢它,因为它使可读性降低,尤其是当您有100行时。

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

FROM alpine:latest
RUN echo '  *****first row *****  
            *****second row *****  ' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home
Run Code Online (Sandbox Code Playgroud)

还是有使用该ARG命令的方法?

sir*_*poc 9

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

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

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

RUN echo $' \n\
*****first row ***** \n\
*****second row ***** \n\
*****third row ***** ' >> /home/myfile
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我无法建议编辑(队列已满),因此请注意,此答案中的最后一句话指定了可能不明显的内容。在运行此语句之前,您(可能?)需要在 Dockerfile 中添加 `SHELL ["/bin/bash", "-c"]`。 (2认同)

Dav*_*aze 5

如果您有一个中等大小的文件,通常更容易将其存储在单独的文件中,然后将COPY其直接放入。

FROM alpine:latest
COPY myfile.txt /
CMD cat /myfile.txt
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh
cat /myfile.txt
exec "$@"
Run Code Online (Sandbox Code Playgroud)

然后是 Dockerfile

FROM alpine:latest
COPY myfile.txt entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["???"]
Run Code Online (Sandbox Code Playgroud)

如果文件的实际内容需要依赖于环境变量或其他运行时数据,这也使您可以在运行主程序之前在运行时修改文件(例如,使用sed (1))。