问题:
在 docker build 期间无法使用进程替换,因为 bash 进入 posix 模式 在 Dockerfile 中,我想使用进程替换: RUN echo <(echo ' D A T A : ′ " DATA:'" DATA:′"DATA") 但是docker build使用/bin/sh运行每个 RUN 命令。显然作为sh运行会导致 bash 切换到 POSIX 模式,该模式不允许进程替换: /bin/sh: -c: 第 0
问题:在 docker build 期间无法使用进程替换,因为 bash 进入 posix 模式 在 Dockerfile 中,我想使用进程替换:
RUN echo <(echo '$DATA:'"$DATA")
但是docker build使用/bin/sh运行每个 RUN 命令。显然作为sh运行会导致 bash 切换到 POSIX 模式,该模式不允许进程替换:
/bin/sh: -c: 第 0 行:意外标记 `(' 附近的语法错误
我尝试关闭 POSIX 模式:
RUN set +o posix && echo <(echo '$DATA:'"$DATA")
但似乎语法错误甚至在第一个命令运行之前就发生了。如果我用;替换&&也是一样的。
请注意,该命令(即使是我在这里用作简化示例的命令)同时包含单引号和双引号,因此我不能简单地在bash -c前面加上。
使用的 shell 实际上是一个 bash,但它被 docker 调用为/bin/sh:
运行 ls -l /bin/sh
---> 在 93a9809e12a7 中运行
解答
如果您确定正在构建的映像中有bash,那么您可以使用SHELL命令更改 shell 调用,我在另一个问题中对此进行了描述。
你可以使用SHELL [ “/bin/bash”, “-c” ]。考虑:
$ docker build --no-cache - < <(echo '
> FROM fedora
> RUN cat <(echo hello world)
> ')
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM fedora
---> ef49352c9c21
Step 2/2 : RUN cat <(echo hello world)
---> Running in 573730ced3a3
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `cat <(echo hello world)'
The command '/bin/sh -c cat <(echo hello world)' returned a non-zero code: 1
$ docker build --no-cache - < <(echo '
> FROM fedora
> SHELL ["/bin/bash", "-c"]
> RUN cat <(echo hello world)
> ')
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM fedora
---> ef49352c9c21
Step 2/3 : SHELL ["/bin/bash", "-c"]
---> Running in e78260e6de42
Removing intermediate container e78260e6de42
---> ff6ec782a9f6
Step 3/3 : RUN cat <(echo hello world)
---> Running in afbb42bba5b4
hello world
Removing intermediate container afbb42bba5b4
---> 25f756dcff9b
Successfully built 25f756dcff9b