1

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

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

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

据我了解,docker-compose 使用 docker-compose.yml 文件中的“链接”处理排序,但不处理需要启动的各个进程的状态。我的意思是,一旦第一个进程成功退出,第二个进程就需要启动。

这是我的 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

如果您需要更多详细信息,我很乐意让您知道。提前致谢。

4

1 回答 1

0

我解决问题的方法是在容器之间使用共享卷,其中第一个进程在完成工作后在该卷上创建一个新文件,而另一个进程运行一个循环以检查该文件是否已创建。一旦第二个进程检测到这一点,它就会开始使用该数据。

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

于 2015-05-11T20:51:04.420 回答