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"]