基本上我希望我的程序可以启动/bin/sh -c
的子命令,这样我就可以 Ctrl + C 并让它停止进程。
如果我使用此表格。
ENTRYPOINT executable
它将转换为/bin/sh -c 'executable'
,这使我能够 Ctrl + C ,但它阻止我在运行例如
docker run executable arg1
仍然会以/bin/sh -c 'executable'
结束。
如果我使用数组格式那么定义ENTRYPOINT。
ENTRYPOINT [ "executable" ]
这样可行。
docker run executable arg1
开始以executable arg1
开始运行,但 Ctrl + C 将不起作用,因为它不是shell的子进程。
答案 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 关闭容器。