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

时间:2014-12-30 00:21:57

标签: docker haproxy

我使用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被清除。似乎互联网的其他部分能够做我想做的事情......我在这里做错了什么?

2 个答案:

答案 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 年后无济于事! :) 但也许对某人有用!