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

时间:2019-03-04 10:50:28

标签: docker

在不使标题过长的情况下,出现以下情况...

我有两个脚本:

  1. 第一个脚本(host_startup.sh)检查网站是否正常运行。最终发布后,它将在默认浏览器中打开网站:

    URL=http://localhost:9876
    until contents=$(wget -q --spider --no-check-certificate "$URL")
    do
      sleep 1
    done
    xdg-open ${URL} &
    
  2. 第二个脚本(run.sh)启动host_startup脚本,然后启动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命令...

请告诉我如何实现所需的行为。

1 个答案:

答案 0 :(得分:1)

显然“ Bash不会将诸如SIGTERM之类的信号转发给它正在等待的进程。”

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

(../../host_startup.sh) &
exec docker run --rm -it \
    -p 9786:9786 \
    company:image

将用等待它的docker process替换shell的fork。

基于Suart P. Bentley's answer,基于unix stackexchange

或者,您也可以使用cuonglm's answer的修改版本来手动收听和处理信号,以解决相同的问题。