在 docker 群容器(副本)中使用 pid 1 重新启动进程
Restarting process with pid 1 in docker swarm container (replica)
我在 docker 集群中有 docker nginx 运行。
我想在不重启容器的情况下更改 nginx 的设置。
我替换了容器内的 nginx conf 文件,但我无法重新加载配置
尝试过
root@xxx:/# service nginx
Usage: /etc/init.d/nginx {start|stop|status|restart|reload|force-reload|upgrade|configtest}
root@xxx:/# service nginx reload
[....] Reloading nginx: nginxstart-stop-daemon: warning: failed to kill 1: Permission denied
failed!
root@xxx:/# service nginx force-reload
[....] Reloading nginx: nginxstart-stop-daemon: warning: failed to kill 1: Permission denied
failed!
root@xxx:/# nginx -s reload
2017/03/17 12:57:05 [notice] 281#281: signal process started
2017/03/17 12:57:05 [alert] 281#281: kill(1, 1) failed (13: Permission denied)
nginx: [alert] kill(1, 1) failed (13: Permission denied)
root@xxx:/# ps aux | grep nginx
root 1 0.0 0.1 36124 5500 ? Ss Mar09 0:00 nginx: master process nginx -g daemon off;
nginx 9 0.0 0.1 37328 4476 ? S Mar09 7:32 nginx: worker process
root 243 0.0 0.0 11128 1020 ? S+ 12:45 0:00 grep nginx
root@xxx:/# kill -HUP 1
bash: kill: (1) - Permission denied
有可能吗?
您似乎走错了路:运行 服务在 docker 集群中的要点是任何实例都可以随时消失(例如在节点故障时)并被替换通过一个新创建的新的。
这意味着您不应该操作属于由 swarm 集群管理的服务的容器,因为您的更改随时可能丢失。
您似乎已经 docker exec
进入了这样的容器并手动编辑了配置文件。这是不行的。您的更改非常不稳定。
更好的解决方案是使用您的自定义配置创建一个图像以在 swarm 中使用。每当您的配置更改时,更新图像并将 运行 个实例替换为 docker service update --image my-custom-image:new-version <my-service>
。 Docker 将负责推出更新。如果您的服务是 运行 多个实例,则更新不会导致停机(滚动更新)。
就是说,如果您从 外部 向容器发送 kill 信号,您真正要求的应该会起作用,例如docker kill -s HUP container-name
在服务实例实际为 运行 的 Docker 节点上发出。由于你已经修改了容器内部的配置,你显然知道如何找到容器。
我在 docker 集群中有 docker nginx 运行。 我想在不重启容器的情况下更改 nginx 的设置。 我替换了容器内的 nginx conf 文件,但我无法重新加载配置
尝试过
root@xxx:/# service nginx
Usage: /etc/init.d/nginx {start|stop|status|restart|reload|force-reload|upgrade|configtest}
root@xxx:/# service nginx reload
[....] Reloading nginx: nginxstart-stop-daemon: warning: failed to kill 1: Permission denied
failed!
root@xxx:/# service nginx force-reload
[....] Reloading nginx: nginxstart-stop-daemon: warning: failed to kill 1: Permission denied
failed!
root@xxx:/# nginx -s reload
2017/03/17 12:57:05 [notice] 281#281: signal process started
2017/03/17 12:57:05 [alert] 281#281: kill(1, 1) failed (13: Permission denied)
nginx: [alert] kill(1, 1) failed (13: Permission denied)
root@xxx:/# ps aux | grep nginx
root 1 0.0 0.1 36124 5500 ? Ss Mar09 0:00 nginx: master process nginx -g daemon off;
nginx 9 0.0 0.1 37328 4476 ? S Mar09 7:32 nginx: worker process
root 243 0.0 0.0 11128 1020 ? S+ 12:45 0:00 grep nginx
root@xxx:/# kill -HUP 1
bash: kill: (1) - Permission denied
有可能吗?
您似乎走错了路:运行 服务在 docker 集群中的要点是任何实例都可以随时消失(例如在节点故障时)并被替换通过一个新创建的新的。
这意味着您不应该操作属于由 swarm 集群管理的服务的容器,因为您的更改随时可能丢失。
您似乎已经 docker exec
进入了这样的容器并手动编辑了配置文件。这是不行的。您的更改非常不稳定。
更好的解决方案是使用您的自定义配置创建一个图像以在 swarm 中使用。每当您的配置更改时,更新图像并将 运行 个实例替换为 docker service update --image my-custom-image:new-version <my-service>
。 Docker 将负责推出更新。如果您的服务是 运行 多个实例,则更新不会导致停机(滚动更新)。
就是说,如果您从 外部 向容器发送 kill 信号,您真正要求的应该会起作用,例如docker kill -s HUP container-name
在服务实例实际为 运行 的 Docker 节点上发出。由于你已经修改了容器内部的配置,你显然知道如何找到容器。