在Docker入口点的命令
有没有办法执行一个命令作为Dockerfile入口点的参数? 我正在创build一个应该自动运行mpirun
处理器数量的图像,即mpirun -np $(nproc)
或mpirun -np $(getconf _NPROCESSORS_ONLN)
。
以下线路工作:
ENTRYPOINT ["/tini", "--", "mpirun", "-np", "4"] # works
但是我无法得到一个适应性的forms来工作:
ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$(nproc)"] # doesn't work ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$(getconf _NPROCESSORS_ONLN)"] # doesn't work
使用反引号`nproc`符号也不起作用。 我也不能将环境variables传递给命令。
ENV processors 4 ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$processors"] # doesn't work
有没有人设法得到这种工作stream程?
这些可能不起作用:见问题4783
ENTRYPOINT
和CMD
是特别的,因为它们没有shell(所以你可以select你自己的),iirc他们也逃脱了。与shellforms不同,
exec
forms不会调用命令shell。
这意味着正常的shell处理不会发生。例如,
ENTRYPOINT [ "echo", "$HOME" ]
不会在$HOME
上进行variablesreplace。
如果你想要shell处理,那么使用shell的forms或者直接执行一个shell,例如:ENTRYPOINT [ "sh", "-c", "echo", "$HOME" ]
。
解决方法是使用脚本。
COPY docker-entrypoint.sh / ENTRYPOINT ["/docker-entrypoint.sh"]
该脚本,当docker运行触发它时,至less应该从环境variables中受益。
请参阅运行脚本docker-entrypoint.sh
的vromero/activemq-artemis-docker
docker-entrypoint.sh
。
为了允许CMD
运行,脚本以:
exec "$@"
(它会执行任何参数后,无论是从CMD
指令,或从docker run
参数)
OP Gilly 在评论中补充道:
我在Dockerfile中使用:
COPY docker-entrypoint.sh ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
在入口点脚本中:
#!/bin/bash exec mpirun -np $(nproc) "$@"
这是因为您正在使用exec表单作为您的入口点,并且variablesreplace不会发生在exec表单中。
这是执行forms:
ENTRYPOINT ["executable", "param1", "param2"]
这是shell的forms:
ENTRYPOINT command param1 param2
从官方文档:
与shellforms不同,execforms不会调用命令shell。 这意味着正常的shell处理不会发生。 例如,ENTRYPOINT [“echo”,“$ HOME”]不会在$ HOME上进行variablesreplace