【发布时间】:2017-02-21 19:19:25
【问题描述】:
思路很简单,我需要从一个容器向另一个容器发送信号来重启nginx。
从ssh 中的第一个容器连接到nginx 容器是一个好的解决方案吗?
您还有其他推荐的方法吗?
【问题讨论】:
标签: nginx docker dockerfile
思路很简单,我需要从一个容器向另一个容器发送信号来重启nginx。
从ssh 中的第一个容器连接到nginx 容器是一个好的解决方案吗?
您还有其他推荐的方法吗?
【问题讨论】:
标签: nginx docker dockerfile
我不建议安装ssh,Docker 容器不是虚拟机,并且应该尊重微服务架构以从它提供的许多优势中受益。
为了将信号从一个容器发送到另一个容器,您可以使用 docker API。
首先您需要在所需容器之间共享/var/run/docker.sock。
docker run -d --name control -v /var/run/docker.sock:/var/run/docker.sock <Control Container>
要将信号发送到名为 nginx 的容器,您可以执行以下操作:
echo -e "POST /containers/nginx/kill?signal=HUP HTTP/1.0\r\n" | \
nc -U /var/run/docker.sock
另一个选项是使用带有自定义脚本的自定义图像,它会检查 nginx 配置文件,如果哈希值发生更改,则会发送重新加载信号。这样,每次修改config,nginx都会自动重新加载,也可以使用cmets手动重新加载。这类脚本在kubernetes 用户中很常见。下面是一个例子:
nginx "$@"
oldcksum=`cksum /etc/nginx/conf.d/default.conf`
inotifywait -e modify,move,create,delete -mr --timefmt '%d/%m/%y %H:%M' --format '%T' \
/etc/nginx/conf.d/ | while read date time; do
newcksum=`cksum /etc/nginx/conf.d/default.conf`
if [ "$newcksum" != "$oldcksum" ]; then
echo "At ${time} on ${date}, config file update detected."
oldcksum=$newcksum
nginx -s reload
fi
done
别忘了安装inotifywait 包。
【讨论】: