Docker ENTRYPOINT中的命令

Gil*_*lly 3 mpi docker

有没有办法在Dockerfile ENTRYPOINT中执行命令作为参数?我正在创建一个应该自动运行mpirun处理器数量的图像,即mpirun -np $(nproc)mpirun -np $(getconf _NPROCESSORS_ONLN).

以下行有效:

ENTRYPOINT ["/tini", "--", "mpirun", "-np", "4"] # works
Run Code Online (Sandbox Code Playgroud)

但是我无法使用自适应形式:

ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$(nproc)"] # doesn't work
ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$(getconf _NPROCESSORS_ONLN)"] # doesn't work
Run Code Online (Sandbox Code Playgroud)

使用反引号"nproc"表示法也不起作用.我也不能将环境变量传递给命令.

ENV processors 4
ENTRYPOINT ["/tini", "--", "mpirun", "-np", "$processors"] # doesn't work
Run Code Online (Sandbox Code Playgroud)

有没有人设法得到这种工作流程?

Von*_*onC 8

那些可能不起作用:见问题4783

ENTRYPOINT并且CMD非常特别,因为它们在没有外壳的情况下开始使用(所以你可以选择自己的外壳)和iirc它们也可以逃脱.

与shell表单不同,exec表单不会调用命令shell.
这意味着不会发生正常的shell处理.

例如,ENTRYPOINT [ "echo", "$HOME" ]不会对变量进行替换$HOME.
如果你想要shell处理,那么要么使用shell表单,要么直接执行shell,例如:ENTRYPOINT [ "sh", "-c", "echo", "$HOME" ].

解决方法是使用脚本.

COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

当docker run触发它时,该脚本至少应该受益于环境变量.

例如,参见运行脚本的Dockerfilevromero/activemq-artemis-dockerdocker-entrypoint.sh.
为了允许CMD运行,脚本以:

exec "$@"
Run Code Online (Sandbox Code Playgroud)

(它将执行来自CMD指令或docker run参数的任何参数)


OP基利增加的评论:

我在Dockerfile中使用:

COPY docker-entrypoint.sh
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"] 
Run Code Online (Sandbox Code Playgroud)

在入口点脚本中:

#!/bin/bash
exec mpirun -np $(nproc) "$@"
Run Code Online (Sandbox Code Playgroud)