bash - 在Dockerfile中,RUN/bin/mkdir -p/root/lib/{sh,pl,py,rb}未能按预期完成

标签 bash docker sh

在Dockerfile中,以下行:

RUN /bin/mkdir -p /root/lib/{sh,pl,py,rb}
无法给我预期的结果。我想看看:
lib/
├── pl
├── py
├── rb
└── sh
相反,我看到了:
lib/
└── {sh,pl,py,rb}
这是bash特定的结构吗?我是否需要显式调用bash才能使其工作?我的Dockerfile是否正在使用其他Shell执行操作?请问这是怎么回事?我该如何解决呢?

最佳答案

是的,这是特定于bash的构造。许多Docker镜像(尤其是基于Alpine的镜像)没有bash并且不能使用其非标准扩展。在POSIX shell规范的§2.6 Word Expansions中显示了标准扩展。其中包括波浪号扩展(~/path),参数扩展($VARIABLE),命令替换($(foo)),算术扩展($((1+1)))和路径名扩展(*.c),但不包括bash brace扩展。
shell for循环是一个更可移植的选项:

RUN for lang in sh pl py rb; do \
      mkdir "/lib/$lang"; \
    done

关于bash - 在Dockerfile中,RUN/bin/mkdir -p/root/lib/{sh,pl,py,rb}未能按预期完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64161704/

相关文章:

bash - 在 bash 中连接字符串

docker login 在未安装 X11 的服务器上失败

docker - 运行 minikube start 时 vswitch 未找到 hyperV

c# - ASP.NET Core:Docker恢复/构建未能包含项目中的第三方程序集

linux - 是否可以在 shell 脚本中的命令上设置定时器任务?

linux - 检查 PDF 是否可搜索

linux - 将负数乘以 -1 时的奇怪行为

linux - 将用户名和其他参数通过管道传递给命令行实用程序

linux - 使用rvm install安装Ruby时使用脚本自动输入密码?

linux - 有没有 `ssh-add` Linux alpine one liner