更新:该命令不是有效的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的组合,这是一个字符转义问题吗?
答案 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