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

Killing subprocess from inside a Docker container kills the entire container

在我的 Windows 机器上,我从 docker compose 启动了一个 Docker 容器。我的入口点是一个 Go filewatcher,它 运行 是任务管理器在每次文件更改时的任务。执行的任务构建并 运行s Go 程序。

但在文件更改后我可以再次构建和 运行 程序之前,我必须终止以前的 运行ning 版本。但是我每次kill app进程,容器也没有了

本例中的目标是仅终止 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"是任务管理器中的任务名称。

Docker文件:

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 的进程被终止,而不是生成它的父进程。

您可以使用 "supervisord" 之类的进程管理器并将其配置为重新执行您的脚本或命令,即使您终止了它的进程也会让您的容器保持运行 运行.