如何使用docker compose延迟我的节点红色docker服务?

时间:2017-01-03 12:01:08

标签: docker docker-compose node-red

我认为我正面临着与码头组成的竞争条件。

我有一个需要连接到另一个服务(A)的服务(B),它们都是从同一个docker compose文件运行的。与他们一起,我有另一个服务(C),它是最后一个服务,它也是List<RRProcess> noDuplicates = pSorted .GroupBy(i => i.pID) .Select(group => (RRProcess)group.First().Clone()) .ToList();

我看到的是,如果我启用C服务(在docker compose文件中),那么服务B停止并停止工作,而如果我只运行A和B,则启动就可以了。这对我来说似乎是码头工人的竞争条件,有人可以告诉我该做什么吗?

PS:我的服务C是node-red的构建(在docker中使用npm安装),因此它本身不是操作系统,这限制了我使用一些可用的docker解决方案。

此致

提前致谢,

编辑:我的docker-compose

links

2 个答案:

答案 0 :(得分:0)

正如@hardillb在评论中指出的那样,看到d​​ocker-compose.yml文件会很高兴,但我猜你需要使用depends_on选项,如下所示:

version: '2'
services:
  mysql-int:
    image: mysql:5.6.27
    ports:
      - 3306:3306
    container_name: mysql
  test-int:
    build: ../test
    depends_on:
      - mysql-int
    container_name: test

答案 1 :(得分:0)

depends_on在这里不起作用,它只会给你“容器刚开始的pid1” - 这并不意味着,例如,你的容器将启动并运行其套接字,假设mysql-server已准备好进行连接。

一般模式是,假设我们有db作为mysql容器,app作为应用程序,而app需要首先启动db(完全)

version: '2'
services:
db:
  image: mysql      
app:
  image: me/myapp

然后,您的应用图片的入口点会在脚本顶部执行此操作:

#!/bin/bash
# this script does only exist to wait for the database before we fire up tomcat / standalone

RET=1
echo "Waiting for database"
while [[ RET -ne 0 ]]; do
    sleep 1;
    if [ -z "${db_password}" ]; then
        mysql -h $db_host -u $db_user -e "select 1" > /dev/null 2>&1; RET=$?
    else
        mysql -h $db_host -u $db_user -p$db_password -e "select 1" > /dev/null 2>&1; RET=$?
    fi
done

将host / db / port调整为mysql端口。

通过使用等待它的tcp套接字连接测试,您也可以采用更通用的方法:https://github.com/vishnubob/wait-for-it

您可以在docker docs中找到一般主题:https://docs.docker.com/compose/startup-order/