在docker build期间无法使用进程替换,因为bash进入posix模式

时间:2016-12-28 03:09:59

标签: bash shell docker dockerfile

在Dockerfile中,我想使用进程替换:

RUN echo <(echo '$DATA:'"$DATA")

但是docker build使用/bin/sh运行每个RUN命令。显然以sh运行会导致bash切换到POSIX模式,这不允许进程替换:

/bin/sh: -c: line 0: syntax error near unexpected token `('

我尝试关闭POSIX模式:

RUN set +o posix && echo <(echo '$DATA:'"$DATA")

但似乎在第一个命令运行之前就会发生语法错误。如果我将&&替换为;,则相同。

请注意,该命令(即使是我在此处用作简化示例的命令)也包含单引号和双引号,因此我不能简单地添加bash -c

使用过的shell实际上是一个bash,但它被docker调用为/bin/sh

Step 7 : RUN ls -l /bin/sh
---> Running in 93a9809e12a7
lrwxrwxrwx    1 root     root             9 Dec 28 03:38 /bin/sh -> /bin/bash

2 个答案:

答案 0 :(得分:0)

假设您的sh不是bash,则无法直接在shell模式下使用流程替换;你需要产生一个bash会话(非登录,非交互式):

RUN [ "/bin/bash", "-c", "echo <(echo '$DATA:'\"$DATA\")" ]

在这里,我使用json(又名exec)表单来确保引号易于管理,在这里您只需要在$DATA周围转义引号:\"$DATA\" - 事先阻止json解释。

如果您的sh实际上是bash,则应执行以下操作:

RUN "echo <(echo '$DATA:'"$DATA")"

这也只是输出文件描述符,我不能确定你的计划。

答案 1 :(得分:0)

如果您确定要在映像中构建bash,则可以使用another question中描述的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