从Docker容器内部杀死子进程会杀死整个容器

时间:2019-08-16 14:29:59

标签: linux docker process kill

在Windows机器上,我从docker compose启动了一个Docker容器。我的入口点是Go文件监视程序,该文件监视程序在每次文件更改时都运行taskmanager的任务。执行的任务将生成并运行Go程序。

但是在文件更改后我无法再次构建并运行程序之前,我必须终止以前的运行版本。但是,每当我终止应用程序进程时,容器也就消失了。

在此示例中,目标是仅终止带有PID 74的svc1进程。我尝试了pkill -9 svc1kill $(pgrep svc1)。但是每次父进程也被杀死。

容器内部的命令行输出:

root@bf073c39e6a2:/app/cmd/svc1# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  2.5  0.0 104812  2940 ?        Ssl  13:38   0:00 /go/bin/watcher
root        13  0.0  0.0 294316  7576 ?        Sl   13:38   0:00 /go/bin/task de
root        74  0.0  0.0 219284  4908 ?        Sl   13:38   0:00 /svc1
root        82  0.2  0.0  18184  3160 pts/0    Ss   13:38   0:00 /bin/bash
root        87  0.0  0.0  36632  2824 pts/0    R+   13:38   0:00 ps -aux
root@bf073c39e6a2:/app/cmd/svc1# ps -afx
  PID TTY      STAT   TIME COMMAND
   82 pts/0    Ss     0:00 /bin/bash
   88 pts/0    R+     0:00  \_ ps -afx
    1 ?        Ssl    0:01 /go/bin/watcher -cmd /go/bin/task dev -startcmd
   13 ?        Sl     0:00 /go/bin/task dev
   74 ?        Sl     0:00  \_ /svc1
root@bf073c39e6a2:/app/cmd/svc1# pkill -9 svc1
root@bf073c39e6a2:/app/cmd/svc1

切换到容器日志:

task: Failed to run task "dev": exit status 255
2019/08/16 14:20:21 exit status 1

“ dev”是任务面板中任务的名称。

Dockerfile:

FROM golang:stretch
RUN go get -u -v github.com/radovskyb/watcher/... \
    && go get -u -v github.com/go-task/task/cmd/task
WORKDIR /app
COPY ./Taskfile.yml ./Taskfile.yml
ENTRYPOINT ["/go/bin/watcher", "-cmd", "/go/bin/task dev", "-startcmd"]

我希望只有具有目标PID的进程被杀死,而不是产生它的父进程。

1 个答案:

答案 0 :(得分:0)

您可以使用“ supervisord”之类的进程管理器,并将其配置为重新执行脚本或命令,即使您杀死了可保持容器正常运行的进程也是如此。