【问题标题】:Can I have docker-compose restart a container when a file changes?当文件更改时,我可以让 docker-compose 重新启动容器吗?
【发布时间】:2019-03-17 16:11:39
【问题描述】:
Docker-compose 很好——使用docker-composer up -d 将重新启动所有docker-compose.yml 已更改的容器。但是,如果我更改了我的一个容器在启动时需要读取的 traefik.toml,它将不会被拾取。
是否可以让docker-composer 在重新创建容器时考虑任意文件?
【问题讨论】:
标签:
docker-compose
traefik
【解决方案1】:
不幸的是,Docker-compose 只是一个方便启动容器的工具,它并不关心你的状态。
要模仿这种行为,您可以扩展图像的入口点并自行处理此类用例。
【解决方案2】:
如果您为相关文件设置卷(如下示例)或在 docker 创建卷时在系统上找到卷,则可以。
volumes:
- type: bind
source: .
target: /srv/www
只需设置 watch 命令或 cronjob 即可检查文件。如果发现更改,您可以简单地cd {build dir} && docker-compose down && docker-compose up -d
我建议你有一个脚本来启动 watcher 和 docker-compose 或者一个别名以便于使用。
另一种方法是,您可以让 docker 容器检查其自己的文件,如果它发现更改,只需 exit。运行 cronjob 或 watch 脚本运行 docker-compose up -d 以响应容器未运行。
【解决方案3】:
您可以使用 inotifywait 跟踪 docker-compose.yml 更改,然后调用 docker-compose up -d 以便只有配置更改的服务才会重新启动。 p>
如果你想重启 traefik 容器然后 inotifywatch traefik.toml 文件和 docker-compose restart [traefik-service-name-here]。您也可以重建和重新创建服务。
这是我的开发 bash 脚本的一部分:
#!/usr/bin/env bash
PID=0
trap 'kill $PID' EXIT
if [ -z "$(which inotifywait)" ] ; then
echo "Install inotify-tools"
exit 1
fi
while true; do
sleep 2;
inotifywait -qm --event modify --format '%e' ./docker-compose.yml | echo ""
docker-compose up -d &
done &
PID=$!
docker-compose up
kill $PID