docker-compose中的多个流程执行和订购问题

时间:2015-05-07 22:47:59

标签: bash process apache-zookeeper race-condition docker-compose

我正在尝试为我的API启动一个zookeeper服务器和一个引导过程,另一个过程必须使用docker-compose将我的API写入的数据传递给zookeeper服务器。

执行docker-compose后,我的zookeeper服务器成功启动,我的bootstrap API能够连接到它并能够成功写入数据。

这里的约束是我的第二个进程需要等待我的API将数据写入zookeeper,否则会导致异常,因为在此之前API不会创建任何节点。因此,在我的docker-compose.ml文件的命令部分,我执行了一个bash命令,并通过添加while循环使我的bootstrap API无限运行,以便程序不会退出,并在我的第二个进程中添加了一个sleep语句所以它等到API完成它的工作。 (种类条件处理)。

根据我的理解,docker-compose使用docker-compose.yml文件中的“links”处理排序,但不处理需要启动的单个进程的状态。按状态我的意思是,第一个流程成功退出后,第二个流程需要启动。

这是我的docker-compose.yml文件 -

zookeeper:
  image: xyz.com/temp
  ports:
    - "10000:2181"
bootstrapapi:
  image: xyz.com/temp1
  command: /bin/bash -c "cd /code; make test_data ZK_HOSTS=zookeeper:2181 CLUSTER=cluster ; while [ true ]; do sleep 5; done"
  volumes:
    - .:/test
  links:
    - zookeeper
xyz:
  image: def.com/temp2
  command: /bin/bash -c "sleep 10;python -m test --zk-hosts=zookeeper:2181 --zk-cluster-path=cluster "
  links:
    - zookeeper

如果您需要更多详情,我很乐意通知您。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我解决问题的方法是在容器之间使用共享卷,第一个进程在完成它的工作后在该卷上创建一个新文件,另一个进程运行一个循环来检查这个文件已经被创造了。一旦第二个进程检测到,它就开始消耗这些数据。

这是使用docker-compose中的bash脚本在docker-compose中解决这个生产者 - 消费者竞争条件场景的简单方法。希望这会有所帮助。