Bash大括号扩展无法在Dockerfile RUN命令上运行

Ate*_*ral 10 bash brace-expansion docker dockerfile

我在Dockerfile中运行以下RUN命令,期望在每个列出的子目录下创建"logs"目录:

RUN mkdir -p /opt/seagull/{diameter-env,h248-env,http-env,msrp-env,octcap-env,radius-env,sip-env,synchro-env,xcap-env}/logs
Run Code Online (Sandbox Code Playgroud)

但是当我检查图像时,我看到一个字面上称为"{diameter-env,h248-env,http-env,msrp-env,octcap-env,radius-env,sip-env,synchro-env,xcap-env"的目录}"在/ opt/seagull下创建,而不是发生大括号扩展.

我能做错什么?

Ate*_*ral 18

你没有使用大括号扩展,因为你没有使用Bash.如果查看RUN命令文档:

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" ]
Run Code Online (Sandbox Code Playgroud)

  • 等等,什么?你已经回答了自己的问题,而且你感谢自己......? (19认同)
  • 这不是回答自己的问题让我感到困惑,这只是评论,但嘿,如果它是应得的; D (8认同)
  • 是! :)这是一个令人筋疲力尽的日子,我需要感谢自己最终的RTFM.另外,http://stackoverflow.com/help/self-answer (4认同)
  • 谢谢!我不敢相信我花了45分钟,尝试不同的转义技术,检查默认的bash设置等. (2认同)

小智 6

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

SHELL ["/bin/bash", "-c"]
Run Code Online (Sandbox Code Playgroud)

现在,您的RUN命令应该保持不变。

  • 因此值得滚动浏览已接受的答案。 (2认同)