Somente iniciar um contêiner do Docker depois que o processo em outro contêiner estiver operacional

2

Estou tentando implantar 3 contêineres do Docker, tendo uma relação de dependência entre eles (A - > B - > C). Agora, cada contêiner deve executar uma instância do Akka-Spray, sobre uma instância da JVM.

O problema é: seguindo as abordagens usuais de orquestração, o contêiner A foi iniciado, mas o servidor web não teve tempo de inicializar. Se ele não estiver ativo e em execução antes que o contêiner B esteja operacional, o contêiner B nunca alcançará e assim por diante, com C.

Eu tenho tentado a seguinte abordagem ultimamente: compartilhar um volume de dados entre contêineres; depois que o servidor da Web estiver pronto, um script auxiliar criará um arquivo vazio no volume; executar um script (por meio de um serviço do Upstart) que procura um arquivo vazio para mostrar e dispara o próximo contêiner.

No entanto, o uso de um serviço provavelmente é a causa desse problema: executando

sudo docker run -d -it --name=backend -v ~/docker-test/:/docker-test -v ~/aux/:/aux ubuntu /bin/bash -c "</path/to/test/script>"

funciona bem quando feito simplesmente na linha de comando, mas falha aleatoriamente no script executado pelo serviço Upstart (recebe a mensagem "/bin/bash </path/to/test/script> : no such file or directory" ).

Alguém se deparou com isso também? Eu agradeço muito as sugestões para superar isso.

    
por Pedro Almeida 27.11.2014 / 12:47

2 respostas

1

Por que não olhar para um orquestrador de docker específico, como flynn, deis, estaleiro, etc.?

Uma lista completa aqui

    
por 28.11.2014 / 16:14
1

Uma opção é apenas aguardar até que a porta de rede remota esteja aberta, o que indica que o servidor da Web foi iniciado. O código abaixo é baseado em este tópico no SuperUser

#!/bin/sh
SERVICE_IP='sudo docker inspect -f \"{{.NetworkSettings.IPAddress}}\" $CONTAINER_NAME'
SERVICE_PORT=80
while ! nc -vz \$SERVICE_IP \$SERVICE_PORT; do sleep 1; done

Isso pode ser combinado a um orquestrador de criação de contêineres (se esse orquestrador não oferecer suporte nativo à espera de que "a porta do contêiner esteja ativa" - não sei o que está disponível nessa direção).

    
por 03.12.2014 / 14:34