从 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 svc1
和 kill $(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" 之类的进程管理器并将其配置为重新执行您的脚本或命令,即使您终止了它的进程也会让您的容器保持运行 运行.
在我的 Windows 机器上,我从 docker compose 启动了一个 Docker 容器。我的入口点是一个 Go filewatcher,它 运行 是任务管理器在每次文件更改时的任务。执行的任务构建并 运行s Go 程序。
但在文件更改后我可以再次构建和 运行 程序之前,我必须终止以前的 运行ning 版本。但是我每次kill app进程,容器也没有了
本例中的目标是仅终止 PID 为 74 的 svc1
进程。我尝试了 pkill -9 svc1
和 kill $(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" 之类的进程管理器并将其配置为重新执行您的脚本或命令,即使您终止了它的进程也会让您的容器保持运行 运行.