Gibt es eine Möglichkeit, eine interaktive Shell in einem Container nur mit Docker Compose zu starten? Ich habe so etwas in meiner docker-compose.yml versucht:
myapp:
image: alpine:latest
entrypoint: /bin/sh
Wenn ich diesen Container mit Docker-Compose starte, wird er sofort beendet. Gibt es Flags, die ich dem Befehl entrypoint oder als zusätzliche Option zu myapp hinzufügen kann, um als interaktive Shell zu starten?
Ich weiß, dass es native Docker-Befehlsoptionen gibt, um dies zu erreichen. Ich bin nur neugierig, ob es auch möglich ist, nur Docker Compose zu verwenden.
/bin/sh
Einstiegspunkt in Ihrer Erstellungsdatei haben, was sollte dies tun?docker-compose run myapp
?docker-compose run myapp
dass die Ports nicht verfügbar gemacht werden. Man muss es also benutzen,docker-compose run --service-ports myapp
aber es ist immer noch nicht sehr praktisch.entrypoint: /bin/sh
sollteentrypoint: "/bin/sh"
Antworten:
Sie müssen die folgenden Zeilen in Ihre docker-compose.yml aufnehmen:
Der erste entspricht
-i
indocker run
und der zweite entspricht-t
.quelle
stdin_open
ist das fehlende Glied, um mir einfach das erwartete Verhalten zu liefern, wenn ich an einen meiner Container anhänge, auf dem bereits eine Shell ausgeführt wird.docker-compose run <service_name>
docker exec
wird, funktioniert es nicht , eine Shell darauf zu verwenden.colorama\win32.py, line 152, in SetConsoleTitle: ctypes.ArgumentError: ‘ValueError’: embedded null character
Der kanonische Weg, um eine interaktive Shell mit Docker-Compose zu erhalten, besteht darin, Folgendes zu verwenden:
docker-compose run --rm myapp
Sie können festlegen
stdin_open: true, tty: true
, dass Sie dadurch jedoch keine ordnungsgemäße Shell erhaltenup
, da Protokolle von allen Containern gestreamt werden.Sie können auch verwenden
eine Shell auf einen laufenden Container zu bekommen.
quelle
--service-ports
wenn Sie Ports verfügbar machen (dh für einen Webserver)--rm
Flag hinzuzufügen, damit der Container entfernt wird. Die Antwort von @ lynx0123 ist nicht korrekt. Sie erhalten keine interaktive Shell, wenn Sie ausführendocker-compose up
.docker-compose run
funktioniert. Sie möchten auchcommand: /bin/bash
docker-compose.yml hinzufügen.Im offiziellen Einstiegsbeispiel ( https://docs.docker.com/compose/gettingstarted/ ) mit folgenden Angaben
docker-compose.yml
:Nachdem Sie mit begonnen haben
docker-compose up
, können Sie entweder in Ihrenredis
Container oder in Ihren Container schälenweb
mit:quelle
docker-compose run myapp sh
sollte den Deal machen.Es gibt einige Verwechslungen mit
up
/run
, aber diedocker-compose run
Dokumente haben eine gute Erklärung: https://docs.docker.com/compose/reference/runquelle
Mit Docker-Compose habe ich festgestellt, dass der einfachste Weg, dies zu tun, darin besteht, a
docker ps -a
(nachdem ich meine Container mitdocker-compose up
gestartet habe) und die ID des Containers abzurufen, in dem ich eine interaktive Shell haben möchte (nennen wir es xyz123).Dann ist es einfach auszuführen
docker exec -ti xyz123 /bin/bash
und voila, eine interaktive Shell.
quelle
Wenn jemand aus der Zukunft auch hierher wandert:
oder
oder Sie können einzelne Zeilen wie ausführen
Das ist, nachdem Sie Ihre Container bereits in Betrieb genommen haben
quelle
Sie können
docker-compose exec SERVICE_NAME sh
in der Befehlszeile tun . DasSERVICE_NAME
ist in Ihrem definiertdocker-compose.yml
. Beispielsweise,Das
SERVICE_NAME
wäre "Tierpfleger".quelle
Diese Frage ist für mich sehr interessant, da ich Probleme habe, wenn ich den Container nach Abschluss der Ausführung sofort beende und mit -it behebe:
Und wenn ich es mit Docker Compose automatisieren muss:
Dies macht den Trick: stdin_open: true, tty: true
Dies ist ein Projekt, das mit der Create-React-App generiert wurde
Dockerfile.dev sieht so aus:
Hoffe, dieses Beispiel hilft anderen, ein Frontend (reagieren Sie im Beispiel) in den Docker-Container auszuführen.
quelle
Wenn das
yml
aufgerufen wirddocker-compose.yml
, kann es mit einem einfachen gestartet werden$ docker-compose up
. Der entsprechende Anhang eines Terminals kann einfach sein (bedenken Sie, dass deryml
einen angerufenen Dienst angegeben hatmyservice
):Wenn Sie jedoch einen anderen
yml
Dateinamen verwenden, z. B.docker-compose-mycompose.yml
, sollte dieser mit gestartet werden$ docker-compose -f docker-compose-mycompose.yml up
. Um ein interaktives Terminal anzuhängen, müssen Sie auch dieyml
Datei angeben , genau wie:quelle