MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como executar um comando uma vez no Docker compose


Sugiro adicionar um script de ponto de entrada ao seu contêiner; neste script de ponto de entrada, você pode verificar se o banco de dados foi inicializado e, se não for, executar as etapas necessárias.

Como você notou em sua pergunta, a ordem em que os serviços/contêineres são iniciados não deve ser tida como certa, portanto, é possível que o contêiner do seu aplicativo seja iniciado antes o contêiner do banco de dados, portanto, o script deve levar isso em consideração.

Como exemplo, dê uma olhada na imagem oficial do WordPress, que executa uma inicialização única do banco de dados em seu script de ponto de entrada. O script tenta se conectar ao banco de dados (e tenta novamente se o banco de dados não puder ser contatado (ainda)) e verifica se a inicialização é necessária; https://github.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171

OBSERVAÇÃO

Percebi que você criou um "contêiner somente de dados" para anexar seu volume. Desde o docker 1.9, o docker tem gerenciamento de volume, incluindo volumes de nomenclatura. Por causa disso, você não precisa mais usar contêineres "somente dados".

Você pode remover o contêiner somente de dados do seu arquivo de composição e alterar seu serviço mongo para algo assim;
  mongo:
    image: mongo:latest
    volumes:
      - mongodata:/data/db
    ports:
      - "28001:27017"
    command: --smallfiles --rest --auth

Isso deve criar um novo volume, chamado mongodata se não existir, ou reutilize o volume existente com esse nome. Você pode listar todos os volumes usando docker volume ls e remova um volume com docker volume rm <some-volume> se você não precisar mais