5

对于我的一个家庭项目,我决定使用 docker 容器和 fig 进行编排(第一次使用这些工具)。

这是我的 fig.yaml:

rabbitmq:
  image: dockerfile/rabbitmq:latest
mongodb:
  image: mongo
app:
  build: .
  command: python /code/app/main.py
  links:
   - rabbitmq
   - mongodb
  volumes:
   - .:/code

Rabbitmq 启动时间比我的应用程序的加载时间慢得多。即使 rabbitmq 容器首先开始加载(因为它在应用程序链接中),当我的应用程序尝试连接到 rabbitmq 服务器时它还不可用(它肯定是加载时间问题,因为如果我在连接到 rabbitmq 之前插入睡眠 5 秒 -一切正常)。有没有解决加载时间同步问题的标准方法?

谢谢。

4

3 回答 3

6

我认为没有解决此问题的标准方法,但这是一个已知问题,有些人有可接受的解决方法。

Docker 问题跟踪器上有一个关于在侦听暴露端口之前不考虑容器启动的建议。然而,由于它会在其他地方产生其他问题,它可能不会被接受。也有关于同一主题的无花果提案。

简单的解决方案是像@jcortejoso 所说的那样进行睡眠。来自http://blog.chmouel.com/2014/11/04/avoiding-race-conditions-between-containers-with-docker-and-fig/的示例:

function check_up() {
    service=$1
    host=$2
    port=$3

    max=13 # 1 minute

    counter=1
    while true;do
        python -c "import socket;s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);s.connect(('$host', $port))" \
        >/dev/null 2>/dev/null && break || \
        echo "Waiting that $service on ${host}:${port} is started (sleeping for 5)"

        if [[ ${counter} == ${max} ]];then
            echo "Could not connect to ${service} after some time"
            echo "Investigate locally the logs with fig logs"
            exit 1
        fi

        sleep 5

        (( counter++ ))
    done
}

然后check_up "DB Server" ${RABBITMQ_PORT_5672_TCP_ADDR} 5672在启动您的应用服务器之前使用,如上面的链接中所述。

另一种选择是使用docker-wait。在你的fig.yml.

rabbitmq:
  image: dockerfile/rabbitmq:latest
mongodb:
  image: mongo
rabbitmqready:
  image: aanand/wait
  links:
   - rabbitmq
app:
  build: .
  command: python /code/app/main.py
  links:
   - rabbitmqready
   - mongodb
  volumes:
   - .:/code
于 2014-12-28T16:15:24.657 回答
1

我遇到的类似问题已经使用CMD我的Dockerfiles. 然后您可以运行任何您希望的检查命令(sleep例如,一段时间,或等待服务正在侦听)。我认为没有标准的方法可以做到这一点,无论如何我认为最好的方法是应用程序运行可以要求外部服务启动并运行,并连接到它们,但这在大多数情况下是不可能的案例。

于 2014-12-28T09:59:06.807 回答
0

为了在我们的 CI 上进行测试,我们构建了一个小实用程序,可以在 Docker 容器中使用它来等待链接服务准备好。它会自动从其环境变量中找到所有链接的 TCP 服务,并反复并发地尝试建立 TCP 连接,直到成功或超时。

我们还写了一篇博客文章,描述了我们构建它的原因以及我们如何使用它

于 2015-08-14T12:25:01.487 回答