将参数传递给子处理的入口点

时间:2018-02-01 10:05:35

标签: shell docker docker-compose

基本上我希望我的程序可以启动/bin/sh -c的子命令,这样我就可以 Ctrl + C 并让它停止进程。

如果我使用此表格。

ENTRYPOINT executable

它将转换为/bin/sh -c 'executable',这使我能够 Ctrl + C ,但它阻止我在运行例如COMMAND中传递更多参数>

docker run executable arg1

仍然会以/bin/sh -c 'executable'结束。

如果我使用数组格式那么定义ENTRYPOINT。

ENTRYPOINT [ "executable" ]

这样可行。

docker run executable arg1

开始以executable arg1开始运行,但 Ctrl + C 将不起作用,因为它不是shell的子进程。

2 个答案:

答案 0 :(得分:1)

您需要以交互式模式运行泊坞窗。

使用命令FROM ubuntu COPY hold.sh . ENTRYPOINT ["./hold.sh"]

  

-it 指示Docker分配连接到容器stdin的伪TTY;在容器中创建交互式bash shell。

我已尝试重现您遇到的问题。

Dockerfile我用过

executable

Shell脚本,如$ cat hold.sh #!/usr/bin/env bash echo "$@" echo "waiting" sleep 5m

$ docker build -t test .
$ docker run -it test "running"
running
waiting
^C⏎ 

现在我已经构建并运行

            Normal   Normal   Normal   Normal   Normal   Normal   Normal   Normal  
gene0       5.0794   1.5045        0   0.5155   5.1258        0   1.7961   2.0333
gene1       88.254  60.9309   2.0367   0.5155  40.5405  21.9554  83.9695   0.4067
gene2        8.254   1.5045   1.0183   1.5464  13.0475   0.9758   2.2452   2.0333
gene3       1.2698   1.5045        0        0        0   0.4879    0.449        0
gene4      860.952  853.785  690.428  609.794  584.809  803.568  845.981  662.464

[139 rows x 113 columns]

工作正常。

答案 1 :(得分:0)

您编写了自己的docker-entrypoint.sh脚本,并使用它来包装可执行文件,同时从docker命令传递参数。

使用以下内容创建名为docker-entrypoint.sh的文件。

#!/usr/bin/env sh
executable "$@"

然后在Dockerfile的末尾使用以下命令。

# Copy over the entrypoint script.
COPY docker-entrypoint.sh /usr/local/bin/

# Default entrypoint.
ENTRYPOINT [ "docker-entrypoint.sh" ]

然后你就可以在容器参数中传递可执行文件了。

docker run -it --rm image arg1

将在容器中以这样的方式运行。

PID   USER     TIME   COMMAND
    1 root       0:00 sh /usr/local/bin/docker-entrypoint.sh arg1
    6 root       0:00 executable arg1
   16 root       0:00 sh
   22 root       0:00 ps faux

您还可以在连接时使用 Ctrl + C 关闭容器。