我想在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
命令来执行此操作?
3条答案
按热度按时间fquxozlt1#
还有一个类似的问题,有一个解决方案:How to write commands with multiple lines in Dockerfile while preserving the new lines?
这个问题的答案更具体的是如何在bash中使用多行字符串,而不是如何使用Docker。
按照这个解决方案,你可以完成你想做的事情,如下所示:
字符串
关于这个前导美元符号的更多信息在这里:前导美元符号如何影响Bash中的单个报价?
请注意,此语法依赖于使用/bin/bash的run命令,而不是/bin/sh。
tquggr8v2#
如果你有一个中等大小的文件,通常更容易将其存储在一个单独的文件中,只需
COPY
即可。字符串
这也扩展到了
ENTRYPOINT
和CMD
命令。与其编写复杂的shell命令(特别是作为ENTRYPOINT
),编写单独的shell脚本通常更容易。如果应用程序在运行容器所做的主要工作之前打印该文件的内容很重要,则可以编写以下入口点脚本:型
然后是Dockerfile
型
如果文件的实际内容需要依赖于环境变量或其他运行时数据,这也为您提供了一个在运行时修改文件的地方(例如,使用sed(1)),然后运行主程序。
omqzjyyz3#
从Dockerfile版本1.4开始,你可以使用here-documents来完成这个任务,只要你用
syntax
指令指定版本:字符串
请参阅here-document规范了解更多细节。特别注意,可以使用
<<-
而不是<<
来剥离前导标签,以便在Dockerfile中直观地区分here-document内容。