我在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
有可能吗?
答案 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
。由于您已经修改了容器内的配置,因此您显然知道如何找到容器。