如何在Dockerfile中正确格式化嵌套的bash命令?

时间:2019-10-26 04:23:12

标签: bash docker dockerfile

更新:该命令不是有效的JSON。 Docker在检测到有效的JSON数组时将使用RUN的“ exec形式”,否则,如果检测到无效的JSON,它将退回到使用RUN的“ shell形式”。

["bash", "-c", "bash -c 'echo SHLVL: \$SHLVL'"] << \$ is illegal JSON!

但是,如果我添加额外的\,那么Bash将不会在SHLVL上进行变量扩展。而是打印SHLVL: $SHLVL。在https://github.com/moby/moby/issues/40140#issuecomment-546638065

中查看详细信息

嵌套的bash实例使SHLVL环境变量(http://tldp.org/LDP/abs/html/internalvariables.html)递增。

例如:

$ echo $SHLVL
1
$ bash -c "echo \$SHLVL"
2
$ bash -c "bash -c 'echo \$SHLVL'"
3

我正在尝试在Dockerfile中执行相同的命令,但出现错误(请在我的Github Actions中查看此信息 https://github.com/dgroomes/docker-shell-example/commit/20ee36e913729b7cbf7f0e46ffebf359af5cf1a9/checks?check_suite_id=282718710#step:6:20)。

Step 3/3 : RUN ["bash", "-c", "bash -c 'echo SHLVL: \$SHLVL'"]
 ---> Running in 2255c65b43c9
/bin/sh: 1: [bash,: not found

通过Dockerfile + Bash的组合,这是一个字符转义问题吗?

2 个答案:

答案 0 :(得分:0)

您的容器未安装bash,请改用sh -c运行命令。尽管如此,大多数看起来容器已经为您的命令运行/bin/sh。这意味着运行echo SHLVL: \$SHLVL就足够了。

答案 1 :(得分:0)

从这个例子中讲,不必要的字符转义是“问题”。

尝试此Dockerfile并查看类似问题中的解释:Bash instances are not nesting in Dockerfile `RUN`

FROM debian:10
RUN ["bash", "-exc", "bash -exc 'echo SHLVL: $SHLVL'"]
RUN ["bash", "-exc", ":; bash -exc ':; echo SHLVL: $SHLVL'"]

那么为什么在这里不必转义: 在第一个变体中,外部bash执行命令:

bash -exc 'echo SHLVL: $SHLVL'

由于使用单引号,因此不需要转义。通过bash的x设置跟踪变量的扩展,并检查Dockerfile构建输出:

Sending build context to Docker daemon  14.85kB
Step 1/3 : FROM debian:10
 ---> 8e9f8546050d
Step 2/3 : RUN ["bash", "-exc", "bash -exc 'echo SHLVL: $SHLVL'"]
 ---> Running in 07aaddefac26
+ bash -exc 'echo SHLVL: $SHLVL'
SHLVL: 1
+ echo SHLVL: 1
Removing intermediate container 07aaddefac26
 ---> e82b3fc4b569
Step 3/3 : RUN ["bash", "-exc", ":; bash -exc ':; echo SHLVL: $SHLVL'"]
 ---> Running in 1257c43b276d
+ :
+ bash -exc ':; echo SHLVL: $SHLVL'
+ :
+ echo SHLVL: 2
SHLVL: 2
Removing intermediate container 1257c43b276d
 ---> cfa749c16631
Successfully built cfa749c16631
Successfully tagged test:latest
相关问题