如何使用单个命令在 Dockerfile 中输出多行字符串
How to output a multiline string in Dockerfile with a single command
我想在 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
命令来做到这一点?
还有一个类似的问题有解决办法:
这个问题的答案更讲究如何在bash中使用多行字符串,而不是如何使用Docker。
按照此解决方案,您可以完成您想要执行的操作,如下所示:
RUN echo $' \n\
*****first row ***** \n\
*****second row ***** \n\
*****third row ***** ' >> /home/myfile
有关此领先美元符号的更多信息,请点击此处:
How does the leading dollar sign affect single quotes in Bash?
请注意,此语法依赖于使用 /bin/bash 的 运行 命令,而不是 /bin/sh。
如果您有一个中等大小的文件,将它存储在一个单独的文件中通常会更容易 COPY
。
FROM alpine:latest
COPY myfile.txt /
CMD cat /myfile.txt
这也扩展到 ENTRYPOINT
和 CMD
命令。与其编写复杂的 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))在 运行 主程序之前,如果它的实际内容需要依赖于环境变量或其他运行时数据。
我想在 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
命令来做到这一点?
还有一个类似的问题有解决办法:
这个问题的答案更讲究如何在bash中使用多行字符串,而不是如何使用Docker。
按照此解决方案,您可以完成您想要执行的操作,如下所示:
RUN echo $' \n\
*****first row ***** \n\
*****second row ***** \n\
*****third row ***** ' >> /home/myfile
有关此领先美元符号的更多信息,请点击此处: How does the leading dollar sign affect single quotes in Bash?
请注意,此语法依赖于使用 /bin/bash 的 运行 命令,而不是 /bin/sh。
如果您有一个中等大小的文件,将它存储在一个单独的文件中通常会更容易 COPY
。
FROM alpine:latest
COPY myfile.txt /
CMD cat /myfile.txt
这也扩展到 ENTRYPOINT
和 CMD
命令。与其编写复杂的 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))在 运行 主程序之前,如果它的实际内容需要依赖于环境变量或其他运行时数据。