Bash脚本中的$ @ blank是入口点,除非–entrypoint

考虑下面的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 abc 

我刚刚得到

 args: 

换句话说, $@不起作用。 但是,这似乎表明,shell脚本本身是确定的:

 docker run --rm --entrypoint /bin/bash entrypoint-test /run.sh abc 

生产

 args: abc 

如预期。 即使陌生人,

 docker run --rm --entrypoint /run.sh entrypoint-test abc 

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

在文档中我看不到任何可能暗示argv在某些情况下会变成空白的东西,也许涉及#! 可执行脚本。

添加

 cat /proc/$$/cmdline 

到shell脚本确认参数不被传递,除非使用--entrypoint

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

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

https://serverfault.com/a/647790/144361指出我在正确的方向。 这些文件明确指出,“壳forms”不接受论据。 以下语法工作:

 ENTRYPOINT ["/run.sh"]