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

String 如何使用单个命令在Dockerfile中输出多行字符串,string,bash,docker,dockerfile,multiline,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/myf

我想在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  
FROM alpine:latest
RUN printf '  *****first row *****  \n  *****second row *****  \n' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home
FROM alpine:latest
RUN echo '  *****first row *****  
            *****second row *****  ' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home
但我不喜欢它,因为它会降低可读性,特别是当你有100行的时候

我想知道有没有办法做到这一点:

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  
FROM alpine:latest
RUN printf '  *****first row *****  \n  *****second row *****  \n' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home
FROM alpine:latest
RUN echo '  *****first row *****  
            *****second row *****  ' >> /home/myfile
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home

或者有没有办法使用
ARG
命令来执行此操作

还有一个与此类似的问题需要解决:

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

按照此解决方案,您可以完成如下所示的任务:

RUN echo $' \n\
*****first row ***** \n\
*****second row ***** \n\
*****third row ***** ' >> /home/myfile
有关此主要美元符号的更多信息,请单击此处:


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

如果您有一个中等大小的文件,则通常更容易将其存储在单独的文件中,只需将其复制到

阿尔卑斯山:最新版本 复制myfile.txt/ CMD cat/myfile.txt 这也扩展到
ENTRYPOINT
CMD
命令。与编写复杂的shell命令(尤其是作为
入口点
)相比,编写单独的shell脚本通常更容易。如果应用程序在运行容器的主要功能之前打印该文件的内容很重要,那么可以编写一个入口点脚本,如

#/垃圾箱/垃圾箱
cat/myfile.txt
执行官“$@”
然后是Dockerfile

阿尔卑斯山:最新版本 复制myfile.txt entrypoint.sh/ 运行chmod+x/entrypoint.sh 入口点[“/ENTRYPOINT.sh”] CMD[“??”]
如果文件的实际内容需要依赖于环境变量或其他运行时数据,那么在运行主程序之前,您还可以在运行时修改文件(例如,使用sed(1))。

OMG感谢此解决方案。非常适合生成一个.repo文件来解决缺少的rpm install deps,而无需将其保存到Dockerfile旁边的repo中。还意味着可以基于ARG或ENV布尔值生成文件,以防同一Dockefile文件需要在不同环境中使用(针对不同的.repo进行解析),我无法建议编辑(队列已满),因此请注意,此答案中的最后一句话指定了可能不明显的内容。在运行此语句之前,您(可能?)需要在Dockerfile中添加
SHELL[“/bin/bash”、“-c”]