除非--entrypoint,否则Bash脚本中的$ @为空,这是ENTRYPOINT

时间:2017-08-16 15:51:39

标签: bash docker

考虑以下Dockerfile

FROM ubuntu:xenial-20170802
RUN (echo '#!/bin/bash'; echo 'echo "args: $@"') > /run.sh && chmod a+x /run.sh
ENTRYPOINT /run.sh

使用Docker 1.12.6(在Ubuntu Zesty主机上,如果重要),如果我

docker build -t entrypoint-test .
docker run --rm entrypoint-test a b c

我得到了

args: 

换句话说,$@无效。但是,这似乎表明shell脚本本身没问题:

docker run --rm --entrypoint /bin/bash entrypoint-test /run.sh a b c
制造

args: a b c

正如所料。更奇怪的是,

docker run --rm --entrypoint /run.sh entrypoint-test a b c

的工作原理。请注意,与原始命令相比,除了使用相同值的ENTRYPOINT覆盖--entrypoint指令外,我什么都不做。那么为什么会这样呢?

我在docs中看不到任何暗示argv在某些情况下会是空白的内容,可能涉及#!个可执行脚本。

添加

cat /proc/$$/cmdline

到shell脚本确认除非使用--entrypoint,否则不会传递参数:

/bin/bash^@/run.sh^@a^@b^@c^@

VS

/bin/bash^@/run.sh^@

1 个答案:

答案 0 :(得分:2)

https://serverfault.com/a/647790/144361指出了我正确的方向。 These docs明确指出“shell表单”不接受参数。以下语法有效:

ENTRYPOINT ["/run.sh"]