Ich versuche nun, einen einfachen Container mit Shell (/bin/bash) auf einem Kubernetes-Cluster auszuführen.
Ich dachte, es gäbe eine Möglichkeit, einen Container auf einem Docker-Container laufen zu lassen, indem man "pseudo-tty" und die Option "detach" (Option "td" im Befehl "Docker run") verwendet.
Zum Beispiel,
$ sudo docker run -td ubuntu:latest
Gibt es eine solche Option in Kubernetes?
Ich habe versucht, einen Container mit dem Befehl "kubectl run-container" zu starten:
kubectl run-container test_container ubuntu:latest --replicas=1
Aber der Container beendet sich für ein paar Sekunden (genau wie beim Start mit dem docker run
Befehl ohne Optionen, den ich oben erwähnt habe). Und ReplicationController startet ihn immer wieder neu.
Gibt es eine Möglichkeit, einen Container auf Kubernetes laufen zu lassen, wie die "td"-Optionen im "docker run"-Befehl?
Sie können diese CMD in Ihrem Dockerfile
verwenden:
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
Dies hält Ihren Container am Leben, bis er aufgefordert wird, zu stoppen. Die Verwendung von trap und wait sorgt dafür, dass Ihr Container sofort auf eine Stopp-Anforderung reagiert. Ohne trap/wait dauert das Anhalten ein paar Sekunden.
Bei Busybox-basierten Images (die in Alpine-basierten Images verwendet werden) kennt sleep das Argument infinity nicht. Mit diesem Workaround erhalten Sie die gleiche unmittelbare Reaktion auf einen docker stop
wie im obigen Beispiel:
CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
Ein Container wird beendet, wenn sein Hauptprozess beendet wird. So etwas zu tun wie:
docker run -itd debian
um den Container offen zu halten, ist offen gesagt ein Hack, der nur für schnelle Tests und Beispiele verwendet werden sollte. Wenn Sie nur einen Container zum Testen für ein paar Minuten wollen, würde ich tun:
docker run -d debian sleep 300
Das hat den Vorteil, dass der Container automatisch beendet wird, wenn man ihn vergisst. Alternativ könnte man so etwas auch in eine "while"-Schleife einbauen, um es für immer laufen zu lassen, oder einfach eine Anwendung wie "top" laufen lassen. All dies sollte in Kubernetes leicht zu bewerkstelligen sein.
Die eigentliche Frage ist, warum Sie das tun wollen? Ihr Container sollte einen Dienst bereitstellen, dessen Prozess den Container im Hintergrund am Laufen hält.
Ich konnte dies mit dem Befehl sleep infinity
in Kubernetes zum Laufen bringen, der den Container offen hält. Siehe diese Antwort für Alternativen, wenn das nicht funktioniert.