【问题标题】: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
      

      【讨论】:

        猜你喜欢
        • 2019-02-13
        • 1970-01-01
        • 1970-01-01
        • 2018-08-28
        • 2020-12-26
        • 1970-01-01
        • 2019-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多