【问题标题】:Bash brace expansion not working on Dockerfile RUN commandBash 大括号扩展不适用于 Dockerfile RUN 命令
【发布时间】:2017-03-03 01:22:54
【问题描述】:

我在我的 Dockerfile 中运行以下 RUN 命令,期望在每个列出的子目录下创建一个“日志”目录:

RUN mkdir -p /opt/seagull/{diameter-env,h248-env,http-env,msrp-env,octcap-env,radius-env,sip-env,synchro-env,xcap-env}/logs

但是当我检查图像时,我看到一个目录字面意思是“{diameter-env,h248-env,http-env,msrp-env,octcap-env,radius-env,sip-env,synchro-env, xcap-env}" 在 /opt/seagull 下创建,而不是进行大括号扩展。

我做错了什么?

【问题讨论】:

  • 我不知道哪种方法,但是RUN 是否在 bash 下运行?
  • 事实证明,这取决于您使用的是 shell 形式还是 exec 形式。请参阅下面的答案。

标签: bash docker dockerfile brace-expansion


【解决方案1】:

您没有使用大括号扩展,因为您没有使用 Bash。如果你看documentation for the RUN command

RUN(shell形式,命令在shell中运行,Linux默认为/bin/sh -c,Windows默认为cmd /S /C)

还有:

注意:要使用“/bin/sh”以外的其他 shell,请使用传入所需 shell 的 exec 形式。例如,RUN ["/bin/bash", "-c", "echo hello"]

因此,只需将命令更改为使用 exec 形式并显式使用 Bash shell:

RUN [ "/bin/bash", "-c", "mkdir -p /opt/seagull/{diameter-env,h248-env,http-env,msrp-env,octcap-env,radius-env,sip-env,synchro-env,xcap-env}/logs" ]

【讨论】:

  • 谢谢!我不敢相信我在这上面花了 45 分钟,尝试不同的转义技术,检查默认 bash 设置等。
  • 等等,什么?您已经回答了自己的问题,并为此感谢自己...?
  • 是的! :) 这是令人筋疲力尽的一天,我需要感谢自己终于有了 RTFM。另外,stackoverflow.com/help/self-answer
  • 不是回答自己的问题让我很困惑,只是评论,但是,如果值得的话 ;D
  • 你能不能ln -f /bin/bash /bin/sh,我相信原因是现在/bin/sh通常是/bin/dash的符号链接。
【解决方案2】:

如果/bin/bash 在您的映像中可用,您可以更改 docker 构建系统用来执行您的RUN 命令的 shell,如下所示:

SHELL ["/bin/bash", "-c"]

现在,您的 RUN 命令应该不会改变。

【讨论】:

  • 非常值得滚动过去接受的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多