我使用https://github.com/dockerfile/haproxy
中的默认HAProxy Docker镜像很遗憾,我无法让它正确地重新加载我的配置。
如果我跑
$ 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统计页面的不同信息集。
我试图设置它以便我可以对我们的遗留软件进行优雅的重新部署,但它在Tomcat会话中做了非常非常坏事,所以我唯一的选择是保持现有会话处于活动状态并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容器放在头上并启动新的容器。我已经完成了系统设置,我可以正常生成新配置,但是当我重新加载时......发生了奇怪的事情。
如前所述,它最终产生了几个haproxy进程。我从统计信息页面和unix套接字获取不同的信息。我似乎在浏览器与socat中进行通信的进程的pid文件也不同。
最糟糕的是,它将停止与503的http连接 - 并且使用ab
进行测试将报告一些丢弃的连接。这部分不行。
旧会话必须继续运行,直到旧服务器关闭/ cookie被清除。似乎互联网的其他部分能够做我想做的事情......我在这里做错了什么?
答案 0 :(得分:2)
如果您在容器内运行ps,如下所示,您将看到已链接的容器运行haproxy作为pid 1,在不杀死容器的情况下无法杀死它,并且它在前台运行,因此没有pid文件。如果要在容器的后台重新加载运行haproxy,并将其他进程(如supervisor)作为主进程。
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
答案 1 :(得分:1)
您现在可以重新加载配置:
docker kill -s HUP haproxy_container_name
更多信息:https://hub.docker.com/_/haproxy
我知道这是一个老问题,6 年后无济于事! :) 但也许对某人有用!