"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment exécuter une commande une seule fois dans Docker Compose ?

Comment exécuter une commande une seule fois dans Docker Compose ?

Publié le 2024-11-19
Parcourir:108

How to Run a Command Only Once in Docker Compose?

Exécuter une commande une fois dans Docker Compose

Lorsque vous travaillez avec un fichier de composition Docker, il peut s'avérer nécessaire d'exécuter une commande spécifique une seule fois, souvent lors de la configuration initiale d'une demande. Cette exigence se pose lorsque l'application dépend d'une base de données qui doit être initialisée, et l'initialisation ne doit avoir lieu que lors de la première exécution.

Dans ce cas, l'utilisateur a l'intention d'exécuter la commande ./my-project - configuration pour ajouter les informations nécessaires à la base de données. Pour y parvenir, il est recommandé d'incorporer un script de point d'entrée dans le conteneur.

Script de point d'entrée

Un script de point d'entrée fournit un mécanisme pour exécuter des commandes personnalisées avant de démarrer l'application principale. Dans le script du point d'entrée, il est possible de vérifier si la base de données a déjà été initialisée. Si une initialisation est requise, le script peut effectuer les étapes de configuration.

Cette approche garantit que la commande d'initialisation n'est exécutée qu'une seule fois, même si le conteneur est redémarré ou si le service est mis à l'échelle.

Fichier docker-compose.yml

Pour implémenter cette solution, modifiez le fichier docker-compose.yml pour inclure le script suivant dans la définition du service my_project :

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

Dans ce cas, data est le volume contenant le code de l'application et Entrypoint.sh est le script du point d'entrée.

entrypoint.sh Script

Créez un script Entrypoint.sh avec le contenu suivant :

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

Dans ce script, mongo est le nom d'hôte du conteneur Mongo et my_project est le nom de la base de données.

Ce script vérifie si un document particulier existe dans la collection utilisateur du base de données. Si le document n'existe pas, cela indique que la base de données n'a pas été initialisée et la commande setup est exécutée. Sinon, l'application démarre normalement.

Suppression du « conteneur de données uniquement »

Notez que l'utilisateur a initialement utilisé un « conteneur de données uniquement » pour monter le volume de la base de données. Cependant, cette approche n'est plus nécessaire avec Docker 1.9 et versions ultérieures, qui prennent en charge les volumes nommés. Par conséquent, le conteneur mongodata peut être supprimé du fichier docker-compose.yml et le service mongo peut être modifié pour utiliser directement le volume nommé.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3