如何在默认的Dockerfile上重新加载haproxy.cfg?

我使用https://github.com/dockerfile/haproxy中的默认HAProxy Docker镜像

不幸的是,我无法正确地重新加载我的configuration。

如果我跑

$ sudo docker exec haprox haproxy -f /etc/haproxy/haproxy.cfg -p '$(</var/run/haproxy.pid)' -st '$(</var/run/haproxy.pid)' 

它只是倾倒出帮助文件。 如果我跑

 $ sudo docker exec haprox 'haproxy -f /etc/haproxy/haproxy.cfg -p $(</var/run/haproxy.pid) -st $(</var/run/haproxy.pid)' 

我明白了

 2014/12/30 00:03:23 docker-exec: failed to exec: exec: "haproxy -f /etc/haproxy/haproxy.cfg -p $(</var/run/haproxy.pid) -st $(</var/run/haproxy.pid)": stat haproxy -f /etc/haproxy/haproxy.cfg -p $(</var/run/haproxy.pid) -st $(</var/run/haproxy.pid): no such file or directory 

嘘。 这些都不是我想要的。 我可以运行docker exec haprox service haproxy reload – 但是这最终产生了几个haproxy进程,所以当我通过unix套接字连接时,我从show stat获得一组信息,但是我从http stats页面获得了一组完全不同的信息。

我正在设置它,以便我们可以对我们的传统软件进行优雅的重新部署,但是它会对Tomcat会话做非常糟糕的事情,所以我唯一的select是保持现有的会话活动并ping同一台服务器。

 backend legacy cookie SERVERID insert indirect preserve server A 123.0.0.123:8080 cookie A check server B 123.0.0.123:8080 cookie B check 

做的伎俩。 我可以调用套接字并运行set weight legacy/A 0 ,它将耗尽服务器A的连接。

但是(记住遗留的部分?)我必须把我的服务器A / B容器在头上,并提出新的。 我有我的系统设置,我正在生成新的configuration就好了,但是当我重新加载…奇怪的事情发生。

如前所述,它最终产生了几个haproxy进程。 我从统计页面和unix套接字获得不同的信息。 这也似乎是我在浏览器与socat通信的过程的pid文件是不同的。

最糟糕的是,它会停止与503的HTTP连接 – 并使用ab来testing将报告一些下降的连接。 这部分不好。

旧的会话必须继续运行,直到旧的服务器closures/ cookies被清除。 似乎互联网的其余部分能够做我想做的事情…我在这里做错了什么?

如果你在容器中运行ps,你会看到你已经链接的容器运行haproxy作为pid 1,不能在不杀死容器的情况下杀死它,并且它在前台运行,所以没有pid文件。 如果你想重载在你的容器的后台运行haproxy,并使一些其他进程(如主pipe进程)成为主进程。

 docker exec -it haproxy ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND haproxy 1 0.0 0.2 28988 4576 ? Ss 02:41 0:00 haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid