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.
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.
Um diese Lösung zu implementieren, ändern Sie die Datei „docker-compose.yml“, um das folgende Skript in den Dienst „my_project“ aufzunehmen Definition:
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 enterpoint.sh ist das Entrypoint-Skript.
Erstellen 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 ist der Datenbankname.
Dieses Skript prüft, ob ein bestimmtes Dokument in der Benutzersammlung der Datenbank vorhanden ist. 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.
Beachten Sie, dass der Benutzer ursprünglich einen „Nur-Daten-Container“ verwendet hat, um das Datenbank-Volume bereitzustellen. Mit Docker 1.9 und höher, das benannte Volumes unterstützt, ist dieser Ansatz jedoch nicht mehr erforderlich. 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.
Das obige ist der detaillierte Inhalt vonWie führe ich einen Befehl in Docker Compose nur einmal aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!