图:docker容器启动同步

Jen*_*ner 5 rabbitmq docker fig

对于我的一个家庭项目,我决定使用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
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

duk*_*ody 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
}
Run Code Online (Sandbox Code Playgroud)

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