问题:在 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:

第 7 步:运行 ls -l /bin/sh

---> 在 93a9809e12a7 中运行

lrwxrwxrwx 1 根根 9 Dec 28 03:38 /bin/sh -> /bin/bash

解答

如果您确定正在构建的映像中有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
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐