在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

ENTRYPOINTCMD是特别的,因为它们没有shell(所以你可以select你自己的),iirc他们也逃脱了。

与shellforms不同, execforms不会调用命令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.shvromero/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