Docker--后台进程运行时rm未清理

Docker--后台进程运行时rm未清理,docker,Docker,在不让标题太长的情况下,下面是一个场景 我有两个脚本: 第一个脚本host_startup.sh检查网站是否已启动。当它最终发布时,会在默认浏览器中打开网站: URL=http://localhost:9876 until contents=$(wget -q --spider --no-check-certificate "$URL") do sleep 1 done xdg-open ${URL} & 第二个脚本run.sh启动主机启动脚本,然后启动Docker容器,该容器在上

在不让标题太长的情况下,下面是一个场景

我有两个脚本:

第一个脚本host_startup.sh检查网站是否已启动。当它最终发布时,会在默认浏览器中打开网站:

URL=http://localhost:9876
until contents=$(wget -q --spider --no-check-certificate "$URL")
do
  sleep 1
done
xdg-open ${URL} &
第二个脚本run.sh启动主机启动脚本,然后启动Docker容器,该容器在上述地址提供网页:

(../../host_startup.sh) &
docker run --rm -it \
    -p 9786:9786 \
    company:image
请注意,docker命令使用-rm标志运行。但是,当我运行run.sh脚本,并在进程中按Ctrl+C时,Docker映像仍在运行。。。具体来说,docker ps显示的是容器静止

我希望Ctrl+C停止容器并将其清理干净

我认为容器会停止并清理,因为我将host_startup.sh脚本放在后台,而不是docker run命令


请告诉我如何才能达到预期的行为

显然,Bash不会将SIGTERM之类的信号转发给它当前正在等待的进程

因此,您可以将run.sh修改为:

(../../host_startup.sh) &
exec docker run --rm -it \
    -p 9786:9786 \
    company:image
这将用docker进程代替shell的fork,而不用等待它

基于unix的stackexchange


或者,您也可以使用修改版的来手动聆听信号并对其采取行动,以回答相同的问题。

我认为您在原则上是正确的,但浏览器以某种方式抓住了焦点并捕捉到了信号。如果我从主机脚本中删除xdg open${URL}&的话,这就行了。然而,有了它,它就没有了。所以问题一定在那里