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

Way*_*ner 6 haproxy docker

我使用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)'
Run Code Online (Sandbox Code Playgroud)

它只是转储帮助文件。如果我跑

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

我明白了

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
Run Code Online (Sandbox Code Playgroud)

嘘。这些都不是我想要的。我可以运行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
Run Code Online (Sandbox Code Playgroud)

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

但是(还记得那个遗留部分吗?)我必须彻底改变我的服务器 A/B 容器并启动新的容器。我已经完成了系统设置,可以很好地生成新配置,但是当我重新加载时......奇怪的事情发生了。

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

但最糟糕的是,它将停止 503 的 http 连接 - 并且使用ab来测试将报告一些丢失的连接。这部分不太好。

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

Fer*_*iss 10

您现在可以重新加载配置:

docker kill -s HUP haproxy_container_name
Run Code Online (Sandbox Code Playgroud)

更多信息: https: //hub.docker.com/_/haproxy

我知道这是一个老问题,六年后没有任何帮助!:) 但也许对某人有用!

  • -s HUP 向容器发送 SIGHUP 信号。这将重新加载守护进程。维基百科:https://en.wikipedia.org/wiki/SIGHUP:“守护程序有时使用 SIGHUP 作为重新启动的信号,最常见的原因是重新读取已更改的配置文件。” 所以当docker发送SIGHUP信号时,主进程就会接收到。如果您创建自己的docker镜像,并且另一个守护进程将是容器的主进程,则必须将SIGHUP信号转发给haproxy守护进程。阅读 haproxy 文档中的“重新加载配置”部分。 (2认同)

Usm*_*ail 4

如果您在容器内运行 ps ,如下所示,您将看到您链接的容器以 pid 1 运行 haproxy,如果不杀死容器就无法杀死它,而且它在前台运行,因此没有 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
Run Code Online (Sandbox Code Playgroud)