19

我在我的 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

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

我可能做错了什么?

4

2 回答 2

37

您没有使用大括号扩展,因为您没有使用 Bash。如果您查看RUN 命令的文档

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

并且:

注意:要使用“/bin/sh”以外的其他 shell,请使用传入所需 shell 的 exec 形式。例如,运行 ["/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" ]
于 2016-10-20T21:16:41.253 回答
8

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

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

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

于 2020-10-04T22:07:26.453 回答