„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie führe ich einen Befehl in Docker Compose nur einmal aus?

Wie führe ich einen Befehl in Docker Compose nur einmal aus?

Veröffentlicht am 19.11.2024
Durchsuche:744

How to Run a Command Only Once in Docker Compose?

Einen Befehl einmal in Docker Compose ausführen

Beim Arbeiten mit einer Docker-Compose-Datei kann es erforderlich sein, einen bestimmten Befehl nur einmal auszuführen, häufig während der Ersteinrichtung einer Bewerbung. Diese Anforderung entsteht, wenn die Anwendung von einer Datenbank abhängt, die initialisiert werden muss, und die Initialisierung nur beim ersten Start erfolgen soll.

In diesem Fall beabsichtigt der Benutzer, den Befehl ./my-project - auszuführen. Setup, um die erforderlichen Informationen zur Datenbank hinzuzufügen. Um dies zu erreichen, wird empfohlen, ein Einstiegspunktskript in den Container zu integrieren.

Einstiegspunktskript

Ein Einstiegspunktskript bietet einen Mechanismus zum Ausführen benutzerdefinierter Befehle vor dem Start der Hauptanwendung. Innerhalb des Entrypoint-Skripts ist es möglich zu überprüfen, ob die Datenbank bereits initialisiert wurde. Wenn eine Initialisierung erforderlich ist, kann das Skript die Einrichtungsschritte ausführen.

Dieser Ansatz stellt sicher, dass der Initialisierungsbefehl nur einmal ausgeführt wird, selbst wenn der Container neu gestartet oder der Dienst hochskaliert wird.

Datei „docker-compose.yml“

Um diese Lösung zu implementieren, ändern Sie die Datei „docker-compose.yml“, um das folgende Skript in die Dienstdefinition „my_project“ aufzunehmen:

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

In diesem Fall sind Daten das Volume, das den Anwendungscode enthält, und Eintragspunkt.sh ist das Einstiegspunkt-Skript.

entrypoint.sh-Skript

Erstellen Sie ein Skript „entrypoint.sh“ mit folgendem Inhalt:

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

In diesem Skript ist mongo der Hostname des Mongo-Containers und my_project der Datenbankname.

Dieses Skript prüft, ob ein bestimmtes Dokument in der Benutzersammlung des vorhanden ist Datenbank. Wenn das Dokument nicht vorhanden ist, bedeutet dies, dass die Datenbank nicht initialisiert wurde und der Setup-Befehl ausgeführt wird. Andernfalls startet die Anwendung normal.

Entfernen des „Nur-Daten-Containers“

Beachten Sie, dass der Benutzer ursprünglich einen „Nur-Daten-Container“ verwendet hat, um das Datenbank-Volume bereitzustellen. Dieser Ansatz ist jedoch ab Docker 1.9 nicht mehr erforderlich, da benannte Volumes unterstützt werden. Daher kann der Mongodata-Container aus der Datei docker-compose.yml entfernt und der Mongo-Dienst so geändert werden, dass er das benannte Volume direkt verwendet.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3