使用docker swarm容器(副本)中的pid 1重新启动进程

时间:2017-03-17 13:31:54

标签: nginx docker docker-swarm

我在docker swarm中运行了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

有可能吗?

1 个答案:

答案 0 :(得分:1)

你似乎走错了轨道:在docker swarm中运行服务的重点是任何实例都可以随时消失(例如在节点故障时)并被新创建的新实例替换。 这意味着您不应该操纵属于由群集群集管理的服务的容器,因为您的更改可能随时丢失。 您似乎已将docker exec添加到此类容器中并手动编辑配置文件。这是不行的。你的变化很不稳定。

更好的解决方案是使用您的自定义配置创建一个图像,以便在swarm中使用。只要配置发生更改,请更新映像并使用docker service update --image my-custom-image:new-version <my-service>替换正在运行的实例。 Docker将负责推出更新。如果您的服务运行多个实例,则更新将不会导致停机(滚动更新)。

那就是说,如果你从外面发送杀戮信号到容器,你真正要求的应该是有用的,例如在服务器实例正在运行的Docker节点上发出docker kill -s HUP container-name。由于您已经修改了容器内的配置,因此您显然知道如何找到容器。