Docker ENTRYPOINT中的命令

时间:2015-10-22 06:14:12

标签: docker mpi

有没有办法在Dockerfile ENTRYPOINT中执行命令作为参数?我正在创建一个图片,该图片应自动运行var delay2 = 8.0 * Double(NSEC_PER_SEC) var time2 = dispatch_time(DISPATCH_TIME_NOW, Int64(delay2)) dispatch_after(time2, dispatch_get_main_queue()) { // Code to occur 3 s after the first set of delayed operations. } 处理器的数量,即mpirunmpirun -np $(nproc)

以下行有效:

mpirun -np $(getconf _NPROCESSORS_ONLN)

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

ENTRYPOINT ["/tini", "--", "mpirun", "-np", "4"] # works

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

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

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

2 个答案:

答案 0 :(得分:8)

那些可能无法工作的人:请参阅issue 4783

  

ENTRYPOINTCMD是特别的,因为它们在没有shell的情况下开始(所以你可以选择自己的)并且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"]

当脚本运行触发它时,该脚本至少应该受益于环境变量。

例如,请参阅运行脚本Dockerfile of vromero/activemq-artemis-dockerdocker-entrypoint.sh 为了允许CMD运行,脚本以:

结尾
exec "$@"

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

OP Gilly添加in the comments

  

我在Dockerfile中使用:

COPY docker-entrypoint.sh
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"] 
  

在入口点脚本中:

#!/bin/bash
exec mpirun -np $(nproc) "$@"

答案 1 :(得分:2)

这是因为您正在使用exec表单作为入口点,并且exec表单中不会发生变量替换。

这是执行形式:

ENTRYPOINT ["executable", "param1", "param2"]

这是shell形式:

ENTRYPOINT command param1 param2

来自官方文件:

  

与shell表单不同,exec表单不会调用命令shell。这意味着不会发生正常的shell处理。例如,ENTRYPOINT [“echo”,“$ HOME”]不会对$ HOME

进行变量替换