2017-01-03 2 views
0

Я думаю, что я столкнулся с состоянием гонки с докером.Как можно задержать мой узел-докер-сервис с докерером?

У меня есть служба (B), которая должна быть подключена к другой службе (A), оба запускаются из одного и того же файла. Наряду с ними у меня есть другая служба (C), которая запускается последней, и что она тоже links.

Я вижу, что если я включу службу C (в файле компоновки докеров), то служба B останавливается и перестает работать, тогда как если я запускаю только A и B, запуск идет нормально. Это для меня похоже на состояние гонки в докер, может кто-нибудь посоветует мне, что делать?

PS: Мое обслуживание C - это сборка узла-красного (с использованием установки npm в докере), поэтому сама по себе это не ОС, которая ограничивает меня при использовании некоторых доступных докеревых решений.

С уважением

Спасибо заранее,

EDIT: мой докер-составляющие

version: '2' 

services: 
    rabbitmq: #service A 
    #... 
    handler: #service B 
    image: thethingsnetwork/ttn:latest 
    command: handler --config /etc/ttn/handler/conf.yml 
    depends_on: 
     - discovery 
     - redis 
     - rabbitmq 
    networks: 
     default: 
     aliases: 
      - handler.local 
    ports: 
     - "1904:1904" 
     - "8084:8084" 
    volumes: 
     - "$HOME/host/handler:/etc/ttn/handler" 

    node-red: #service C 
    build: $HOME/host/nodeRed 
    volumes: 
     - /var/lib/docker/node-red/:/root/.node-red/ 
    depends_on: 
     - handler 
     - rabbitmq 
     - broker 
    ports: 
     - "1880:1880" 
     - "5044:5044" #mapping logs 
+0

Это не ясно, что вы спрашиваете здесь. Возможно, вы захотите включить свой файл компоновки, чтобы люди могли получить более четкое представление о том, что вы пытаетесь сделать. – hardillb

+0

. Я добавил частичную компоновку докеров, где узел-красный зависит от этих сервисов, обработчик - это процесс B – ndarkness

ответ

0

Как @hardillb государств в комментарии, было бы неплохо, чтобы увидеть Докер-compose.yml файл, но я думаю, вам нужно будет использовать параметр depend_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 
0

depend_on здесь не будет работать, он только дает вам «контейнер, запускаемый pid1 прямо сейчас» - это не значит, например. что в вашем контейнере будут запущены и запущены его сокеты, скажем, что mysql-сервер готов к подключению.

Общая картина, позволяет сказать, что мы Д.Б., как тузд контейнер, и приложение в качестве приложения, в то время как приложение нуждается в БД должен быть запущен первый (полностью)

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

Затем точка входа вашего приложения image делает это в верхней части сценария:

#!/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 

Отрегулируйте хост/db/порт в порт mysql.

Вы также можете сделать это более общий подход с использованием теста соединения TCP сокета с поживу для-он: https://github.com/vishnubob/wait-for-it

Вы найдете общую тему в докерах документах: https://docs.docker.com/compose/startup-order/

Смежные вопросы