首页 > 解决方案 > 如何使用单个命令在 Dockerfile 中输出多行字符串

问题描述

我想在 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命令来做到这一点?

标签: stringbashdockerdockerfilemultiline

解决方案


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

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

按照此解决方案,您可以完成您想做的事情,如下所示:

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

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

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


推荐阅读