ist jetzt verfügbar! Lesen Sie über die neuen Funktionen und Fehlerbehebungen vom November.

Einen Prozess beim Start des Containers starten

Wenn Sie in einem Entwicklungsccontainer arbeiten, möchten Sie möglicherweise jedes Mal, wenn der Container startet, einen Befehl ausführen oder etwas starten. Der einfachste Weg, dies zu tun, ist die Verwendung der Eigenschaft postStartCommand in devcontainer.json. Wenn Sie beispielsweise yarn install jedes Mal ausführen möchten, wenn Sie sich mit dem Container verbinden, um die Abhängigkeiten auf dem neuesten Stand zu halten, können Sie Folgendes hinzufügen:

"postStartCommand": "yarn install"

Video: npm install ausführen, wenn ein Container erstellt wird



In anderen Fällen möchten Sie möglicherweise einen Prozess starten und ihn weiterlaufen lassen. Dies kann durch die Verwendung von nohup und die Ausführung des Prozesses im Hintergrund mit & erreicht werden. Zum Beispiel:

"postStartCommand": "nohup bash -c 'your-command-here &'"

Video: 'npm start' ausführen, wann immer der Container gestartet wird



Linux-Kenner erwarten möglicherweise, dass sie den Befehl systemctl verwenden können, um Hintergrunddienste zu starten und zu stoppen, die von etwas namens systemd verwaltet werden. Leider hat systemd einen Overhead und wird daher im Allgemeinen nicht in Containern verwendet.

In vielen Fällen gibt es einen Befehl, den Sie stattdessen ausführen können (z. B. sshd). Und unter Debian/Ubuntu gibt es oft Skripte unter /etc/init.d, die Sie direkt ausführen können.

"postStartCommand": "/etc/init.d/ssh start"

Diese Systeme beinhalten auch einen service-Befehl, der systemctl oder /etc/init.d-Skripte verwendet, basierend auf dem, was installiert ist.

"postStartCommand": "service ssh start"

Video: SSH-Dienst in einem Container starten

Startbefehle stattdessen zum Docker-Image hinzufügen

Während postStartCommand praktisch ist und Ihnen erlaubt, Befehle in Ihrem Quellverzeichnis auszuführen, können Sie diese Schritte stattdessen auch mit einem benutzerdefinierten ENTRYPOINT oder CMD zu einem Dockerfile hinzufügen.

Wenn Sie in devcontainer.json auf ein Dockerfile verweisen, wird der Standard-Entrypoint und -Befehl überschrieben. Deaktivieren Sie dieses Verhalten zuerst mit der Eigenschaft overrideCommand.

"overrideCommand": false

Die Eigenschaft overrideCommand hat standardmäßig den Wert true, da viele Images sofort beendet werden, wenn kein Befehl angegeben ist. Stattdessen müssen wir dies in unserem Dockerfile handhaben.

Betrachten Sie als Nächstes dieses Dockerfile

FROM mcr.microsoft.com/devcontainers/base:1-ubuntu

COPY docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT [ "/docker-entrypoint.sh" ]
CMD [ "sleep", "infinity" ]

Das CMD hier stellt sicher, dass der Container standardmäßig weiterläuft. Wenn Sie Ihre Startschritte im ENTRYPOINT belassen, können Sie den Befehl sicher überschreiben, wenn Sie docker run mit Ihrem Image oder Docker Compose verwenden. Dies löst sich zu Folgendem auf:

/docker-entrypoint.sh sleep infinity

Erstellen Sie als Nächstes ein Skript namens docker-entrypoint.sh

#!/usr/bin/env bash

echo "Hello from our entrypoint!"

exec "$@"

Alles, was Sie in dieser Datei ausführen, wird jedes Mal ausgelöst, wenn der Container startet. Es ist jedoch wichtig, die letzte Zeile exec "$@" einzufügen, da dies dazu führt, dass der Befehl sleep infinity in unserem Beispiel ausgeführt wird.

Wenn Sie schließlich Docker Compose verwenden, stellen Sie sicher, dass weder die entrypoint- noch die command-Eigenschaft für Ihren Container eingestellt sind.

© . This site is unofficial and not affiliated with Microsoft.