bash - 从 Dockerfile 删除注释创建 bash 脚本

标签 bash docker escaping comments dockerfile

我正在创建一个需要创建特定 bash 脚本的 Docker 容器。我在我的 Dockerfile 中使用以下 RUN 语句:

RUN printf "#!/bin/bash\n \
# This is a bash comment inside the script\
ls -l" > /home/myuser/script.sh

它运行良好,但生成的脚本只是:

#!/bin/bash
ls -l

因此,最终文件中缺少 bash 注释。我怀疑原因是 Docker 假定该行是 Dockerfile 注释,但由于它包含在双引号内,我认为很明显事实并非如此。

当然,我可以通过将完整的脚本包含在一行中或将其放在外部文件中来解决这个问题,但我认为应该可以在多行引用字符串中包含 bash 注释,而无需这种问题。任何解决方法?我尝试了各种转义,但都没有成功。

最佳答案

没错,Docker 将其解释为 Dockerfile 注释而不是字符串中的注释有点奇怪。作为解决方法,我得到以下工作

FROM ubuntu:latest

RUN printf "#!/bin/bash \
\n# This is a bash comment inside the script \
\nls -l\n" > /script.sh

RUN cat /script.sh

此输出的结果

Step 3 : RUN cat /script.sh
 ---> Running in afc19e228656
#!/bin/bash 
# This is a bash comment inside the script 
ls -l

如果将 \n 移动到注释行的开头,它仍会生成正确的输出,但不再将该行视为 Dockerfile 注释行。


假设我找到了 right command parsing code ,我没看错,Docker 在尝试解析该行以查看它是否有任何命令之前删除了注释。

关于bash - 从 Dockerfile 删除注释创建 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40107199/

相关文章:

bash - 使用lynx获取网站源代码

linux - 在 bash 脚本中切换到 root 用户

docker - CoreDNS 无法在 Kubernetes 集群中运行

php - [已解决]PDO/MySQL 准备语句注入(inject)分号

json - 在 Golang 中解析转义的 json 字符串

linux - 如何使用 Linux bash 函数到 "trigger two processes in parallel"

bash - 使用 &(在 bash 中)创建进程并终止它们是如何工作的?

docker - ELK处理来自多个docker镜像的多行日志

windows - 为桌面安装了 docker。我在设置中找不到共享文件夹选项

escaping - 跨站点脚本(XSS): Do I need to escape the ampersand?