在Windows机器上,我从docker compose启动了一个Docker容器。我的入口点是Go文件监视程序,该文件监视程序在每次文件更改时都运行taskmanager的任务。执行的任务将生成并运行Go程序。
但是在文件更改后我无法再次构建并运行程序之前,我必须终止以前的运行版本。但是,每当我终止应用程序进程时,容器也就消失了。
在此示例中,目标是仅终止带有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”是任务面板中任务的名称。
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的进程被杀死,而不是产生它的父进程。
答案 0 :(得分:0)
您可以使用“ supervisord”之类的进程管理器,并将其配置为重新执行脚本或命令,即使您杀死了可保持容器正常运行的进程也是如此。