"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como executar um comando apenas uma vez no Docker Compose?

Como executar um comando apenas uma vez no Docker Compose?

Publicado em 19/11/2024
Navegar:206

How to Run a Command Only Once in Docker Compose?

Executando um comando uma vez no Docker Compose

Ao trabalhar com um arquivo Docker Compose, pode ser necessário executar um comando específico apenas uma vez, geralmente durante a configuração inicial de um aplicativo. Este requisito surge quando a aplicação depende de um banco de dados que precisa ser inicializado, e a inicialização deve ocorrer somente na primeira execução.

Neste caso, o usuário pretende executar o comando ./my-project - configuração para adicionar as informações necessárias ao banco de dados. Para conseguir isso, é recomendado incorporar um script de ponto de entrada no contêiner.

Script de ponto de entrada

Um script de ponto de entrada fornece um mecanismo para executar comandos personalizados antes de iniciar o aplicativo principal. Dentro do script do ponto de entrada é possível verificar se o banco de dados já foi inicializado. Se a inicialização for necessária, o script poderá executar as etapas de configuração.

Essa abordagem garante que o comando de inicialização seja executado apenas uma vez, mesmo se o contêiner for reiniciado ou o serviço for ampliado.

Arquivo docker-compose.yml

Para implementar esta solução, modifique o arquivo docker-compose.yml para incluir o seguinte script no serviço my_project definição:

services:
  my_project:
    build: .
    volumes:
      - data:/app
    ports:
      - "6060:8080"
    depends_on:
      - mongo
    entrypoint: ["/app/entrypoint.sh"]

Neste caso, data é o volume que contém o código do aplicativo e entrypoint.sh é o script do ponto de entrada.

entrypoint.sh Script

Crie um script entrypoint.sh com o seguinte conteúdo:

#!/bin/bash

# Check if database is initialized.
mongo mongo://admin:admin@mongo:27017/my_project --eval "db.user.findOne()" > /dev/null 2>&1

# If the database is not initialized, perform setup.
if [ $? -ne 0 ]; then
  /app/my_project -setup
fi

# Start the application.
/app/my_project

Neste script, mongo é o nome do host do contêiner Mongo e my_project é o nome do banco de dados.

Este script verifica se um documento específico existe na coleção de usuários do banco de dados. Se o documento não existir, indica que o banco de dados não foi inicializado e o comando setup é executado. Caso contrário, o aplicativo inicia normalmente.

Removendo o "contêiner somente de dados"

Observe que o usuário inicialmente usou um "contêiner somente de dados" para montar o volume do banco de dados. No entanto, esta abordagem não é mais necessária com o Docker 1.9 e posterior, que suporta volumes nomeados. Portanto, o contêiner mongodata pode ser removido do arquivo docker-compose.yml e o serviço mongo pode ser modificado para usar o volume nomeado diretamente.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3