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

von4xj4u  于 12个月前  发布在  Docker
关注(0)|答案(3)|浏览(130)

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

fquxozlt

fquxozlt1#

还有一个类似的问题,有一个解决方案: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

字符串
关于这个前导美元符号的更多信息在这里:前导美元符号如何影响Bash中的单个报价?
请注意,此语法依赖于使用/bin/bash的run命令,而不是/bin/sh。

tquggr8v

tquggr8v2#

如果你有一个中等大小的文件,通常更容易将其存储在一个单独的文件中,只需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)),然后运行主程序。

omqzjyyz

omqzjyyz3#

从Dockerfile版本1.4开始,你可以使用here-documents来完成这个任务,只要你用syntax指令指定版本:

# syntax=docker/dockerfile:1
FROM alpine:latest
COPY <<"EOT" /home/myfile
  *****first row *****  
  *****second row *****    
EOT
ENTRYPOINT cat /home/myfile; sh;
WORKDIR /home

字符串
请参阅here-document规范了解更多细节。特别注意,可以使用<<-而不是<<来剥离前导标签,以便在Dockerfile中直观地区分here-document内容。

相关问题