string - 如何使用单个命令在 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
命令来做到这一点?
解决方案
还有一个与此类似的问题的解决方案: 如何在 Dockerfile 中编写多行命令同时保留新行?
这个问题的答案更具体的是如何在 bash 中使用多行字符串,而不是如何使用 Docker。
按照此解决方案,您可以完成您想做的事情,如下所示:
RUN echo $' \n\
*****first row ***** \n\
*****second row ***** \n\
*****third row ***** ' >> /home/myfile
此处有关此领先美元符号的更多信息:领先 的美元符号如何影响 Bash 中的单引号?
请注意,此语法依赖于使用 /bin/bash 的运行命令,而不是 /bin/sh。
推荐阅读
- animation - 虚幻引擎 4 中变形目标的疯狂值
- python - Python 中的马尔可夫模型实现
- android - 如何重新开始活动并清除玩家状态?
- hashicorp-vault - 带有 k2 v2 的 Spring Cloud Vault - 如何在启动时避免 403?
- database - SQLite3 count 有多少个数?
- image - 用于分类的 CNN 特征
- scala - Spark SFTP 连接器库 - Spark SFTP 连接失败
- xpages - Domino Java 代理能否在不使用映射驱动器号的情况下写入网络位置?
- javascript - 为什么我在 Chrome 的 Network Waterfall 功能中看到请求之间存在很大差距?
- c# - 我们如何在没有存储容器名称、StorageAccountName 和 StorageAccountKey 这些信息的情况下从 Azure 事件中心接收事件