我正在尝试为我的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
如果您需要更多详情,我很乐意通知您。提前谢谢。
答案 0 :(得分:0)
我解决问题的方法是在容器之间使用共享卷,第一个进程在完成它的工作后在该卷上创建一个新文件,另一个进程运行一个循环来检查这个文件已经被创造了。一旦第二个进程检测到,它就开始消耗这些数据。
这是使用docker-compose中的bash脚本在docker-compose中解决这个生产者 - 消费者竞争条件场景的简单方法。希望这会有所帮助。