Docker - Container läuft nicht


92

Ich bin ein Neuling im Hafen. Ich habe versucht, einen verlassenen Container wie folgt zu starten:

  1. Ich habe alle verfügbaren Container mit aufgelistet docker ps -a. Es listete Folgendes auf:

    Docker listet alle Bilder auf

  2. Ich habe die folgenden Befehle eingegeben, um den Container zu starten, der sich in der verlassenen Phase befindet, und um das Terminal dieses Bildes einzugeben.

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. Es wird der folgende Fehler ausgegeben.

    FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running

Aber wenn ich den Container mit starte docker start 79b3fa70b51d. Es gibt die Container-ID als Ausgabe aus, was normal ist, wenn alles normal funktioniert. Ich bin nicht sicher, was diesen Fehler verursacht. Jede Vorstellung von den Ursachen und Vorschlägen dazu wäre für mich sehr hilfreich. Danke im Voraus.


7
Hallo, können Sie bitte erklären, wie Sie dieses Problem behoben haben? Ich fürchte, die Antwort unten macht nicht viel Sinn
JayPex

4
@ApexFred, Docker-Container sind nicht wie VMs. Sie dienen zum Ausführen einer Anwendung. Wenn die Anwendung beendet wird, wird auch der Container beendet. In diesem Fall hat der Benutzer die "Anwendung" für den Container auf den Befehl "echo" gesetzt. Da der Befehl "echo" ein Echo ausführt und dann beendet wird, wird der Container auch mit dem Befehl beendet. Wenn er den Container erneut startet, führt er das Echo aus und wird erneut beendet. Der EXEC-Befehl erfordert einen laufenden Container. Da der Container beendet wurde, können keine zusätzlichen Befehle ausgeführt werden.
duct_tape_coder

Antworten:


31

Container 79b3fa70b51dscheint nur eine zu tunecho .

Das heißt, es startet, hallt und wird sofort beendet.

Der nächste docker execBefehl würde es nicht ausführen, um sich an diesen Container anzuhängen und einen Befehl auszuführen: Es ist zu spät. Der Container wurde bereits verlassen.

Das docker exec Befehl führt einen neuen Befehl in einem laufenden Container aus.

Der Befehl, der mit gestartet wurde, docker execwird nur ausgeführt, während der primäre Prozess des Containers (PID 1) ausgeführt wird


1
Hey VonC, danke für deinen Kommentar. Wie kann ich erreichen, dass ich in das Terminal des Bildes gehe?
Fremder

3
@Udhayakumar Ein einfaches docker run -it --rm udhayakumar/busyboxwithtouchsollte ausreichen, um eine Sitzung zu eröffnen. Der Standardeinstiegspunkt sollte / bin / sh sein, hängt jedoch von Ihrer Docker-Datei ab: Möglicherweise haben Sie einen anderen Einstiegspunkt und / oder eine andere CMD definiert.
VonC

51
Hallo, können Sie bitte erklären, wie Sie dieses Problem behoben haben? Ich fürchte, diese Antwort macht nicht viel Sinn
JayPex

2
@Jawad Wenn Sie busyboxwithtouch ohne Parameter ausführen, wird standardmäßig die interaktive Shell verwendet (die nicht sofort beendet wird). Das heißt, Sie können später ( docker exec) daran anhängen.
VonC

62

Standardmäßig wird der Docker-Container sofort beendet, wenn auf dem Container keine Aufgabe ausgeführt wird.

Versuchen Sie, den Container mit dem Argument --detach(oder -d) auszuführen, damit er im Hintergrund ausgeführt wird .

Zum Beispiel:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 

Das sollte die Antwort sein, großartig.
MEIN

22

Wenn es nicht möglich ist, den Hauptprozess erneut zu starten (lange genug), besteht auch die Möglichkeit, dass commitder Container ein neues Image erstellt und aus diesem Image einen neuen Container ausführt. Dies ist zwar nicht der übliche Best-Practice-Workflow , aber ich finde es sehr nützlich, ab und zu ein fehlerhaftes Skript zu debuggen.

docker exec -it 6198ef53d943 bash
Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running

docker commit 6198ef53d943
sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

docker run -it ace7ca65e6e bash
root@72d38a8c787d:/#

Ich habe den gleichen Schritt befolgt, aber neu erstellte Container nicht über den Browser zugänglich, der zuvor zugänglich war
Muhammad Muazzam

1
Bitte beachten Sie, dass der Befehl einen bashProzess im Container startet . Wahrscheinlich wurde zuvor ein Webserver ausgeführt, sodass Sie überprüfen müssen, welcher Befehl zum Wiederherstellen des Servers verwendet werden muss.
Matthias Kuhn

10

Zunächst müssen wir den Docker-Container starten

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021

                        3a19b39ea021

Überprüfen Sie danach den Docker-Container:

ankit@ankit-HP-Notebook:~$  sudo docker ps -a

 CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES

  3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
  Up 9 seconds                                 ubuntu1

  455b66057060        hello-world                   "/hello"            4 weeks ago         

Exited (0) 4 weeks ago                       vigorous_bardeen

Führen Sie dann den folgenden Befehl aus:

ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash

root@3a19b39ea021:/# 

Es wäre hilfreich, Text hinzuzufügen, der Ihre Antwort erklärt.
Lauren Van Sloun

9

Dies geschieht bei Bildern, für die das Skript keinen Dienst startet, der auf Anforderungen wartet . Daher wird der Container am Ende des Skripts beendet.

Dies ist normalerweise bei den meisten Basis-Betriebssystem-Images (Centos, Debian usw.) oder auch bei den Knoten- Images der Fall .

Am besten führen Sie das Bild im interaktiven Modus aus . Beispiel unten mit dem Knotenbild :

docker run -it node /bin/bash

Ausgabe ist

root@cacc7897a20c:/# echo $SHELL
/bin/bash

5

Hier ist, was für mich funktioniert hat.

Holen Sie sich die Container-ID und starten Sie neu.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


3

Der Grund ist genau das, was die akzeptierte Antwort sagte. Ich füge einige zusätzliche Informationen hinzu, die ein besseres Verständnis für dieses Problem vermitteln können.

  1. Der Status eines Behälters umfasst Created, Running, Stopped, Exited, Deadund andere , wie ich weiß.
  2. Wenn wir ausführen docker create, erstellt der Docker-Daemon einen Container mit dem Status Created.
  3. Wenn der docker startDocker-Daemon einen vorhandenen Container startet, dessen Status möglicherweise Createdoder lautet Stopped.
  4. Wenn wir ausführen docker run, beendet der Docker-Daemon dies in zwei Schritten: docker createund docker start.
  5. Wenn der docker stopDocker-Daemon einen Container stoppt. Somit wäre der Container inStopped Status.
  6. Als wichtigster Fall stellt sich ein Container tatsächlich vor, einen langen Prozess in sich zu haben. Wenn der Prozess beendet wird, wird auch der Containerhalteprozess beendet. Somit wäre der Status dieses Containers Exited.

Wann wird der Prozess beendet? Mit anderen Worten, was ist der Prozess, wie haben wir ihn gestartet?
Die Antwort befindet sich CMDin einer Docker-Datei oder commandim folgenden Ausdruck, der bashin einigen Bildern standardmäßig vorhanden ist, dh ubutu: 18.04.

docker run ubuntu:18.04 [command]

3

docker run -it <image_id> /bin/bash

Im interaktiven Modus ausführen und dann die Bash-Shell ausführen


1
Ich denke, die -dFlagge ist hier ein Tippfehler?

2

Für alle, die mit einer Docker-Datei etwas Ähnliches versuchen ...

Das Ausführen im getrennten Modus hilft nicht. Der Container wird immer beendet (wird nicht mehr ausgeführt), wenn der Befehl nicht blockiert ist. Dies ist bei bash der Fall.

In diesem Fall wäre eine Problemumgehung: 1. Übernehmen Sie das resultierende Image: (Containername = der Name des Containers, auf dem das Image basieren soll, image_name = der Name des zu erstellenden Images Docker-Commit-Containername Bildname 2. Verwenden Sie Docker ausführen, um einen neuen Container mit dem neuen Image zu erstellen und den Befehl anzugeben, den Sie ausführen möchten. Hier führe ich "bash" aus: Docker run -it image_name bash

Dadurch erhalten Sie das interaktive Login, das Sie suchen.


1

Hier ist eine Lösung, wenn der Docker-Container normal beendet wird und Sie die Docker-Datei bearbeiten können.

Wenn ein Docker-Container ausgeführt wird, wird eine Anwendung im Allgemeinen durch Ausführen eines Befehls bereitgestellt. Von Dockerfile Referenz ,

Sowohl CMD- als auch ENTRYPOINT-Anweisungen definieren, welcher Befehl beim Ausführen eines Containers ausgeführt wird. ... Dockerfile sollte mindestens einen der Befehle CMD oder ENTRYPOINT angeben.

Wenn Sie ein Image erstellen und keinen Befehl mit CMD oder ENTRYPOINT angeben, wird der CMD- oder ENTRYPOINT-Befehl des Basisimages ausgeführt.

Zum Beispiel hat die offizielle Ubuntu Docker-Datei CMD ["/bin/bash"]( https://hub.docker.com/_/ubuntu ). Jetzt kann der bin/bash/Befehl Eingaben akzeptieren und docker run -it IMAGE_IDSTDIN an den Container anhängen. Das Ergebnis ist, dass Sie ein interaktives Terminal erhalten und der Container weiterläuft.

Wenn in der Docker-Datei ein Befehl mit CMD oder ENTRYPOINT angegeben ist, wird dieser Befehl beim Ausführen des Containers ausgeführt. Wenn dieser Befehl nun ohne Eingabe beendet werden kann, wird er beendet und der Container wird beendet. docker run -it IMAGE_IDwird NICHTIn diesem Fall das interaktive Terminal bereitgestellt. Ein Beispiel wäre das Docker-Image, das aus der Docker-Datei unten erstellt wurde.

FROM ubuntu
ENTRYPOINT echo hello 

Wenn Sie zum Terminal dieses Bildes gehen müssen, müssen Sie den Container durch Ändern des Befehls entrypoint am Laufen halten.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

Nachdem Sie den Container normal mit ausgeführt haben docker run IMAGE_ID, können Sie einfach zu einem anderen Terminal gehen und docker exec -it CONTAINER_ID bashdas Terminal des Containers abrufen.


"und Sie können die Docker-Datei bearbeiten": Schlüsselpunkt hier. Upvoted.
VonC

0

In meinem Fall habe ich bestimmte Dateinamen und Verzeichnisnamen des übergeordneten Verzeichnisses der Docker-Datei geändert. Aufgrund dessen findet der Container nicht die erforderlichen Parameter, um ihn erneut zu starten.

Nach dem Umbenennen in die ursprünglichen Namen begann der Behälter wie Butter.


0

Ich sehe das anders. Ich konnte docker psa ausführen und feststellen, dass ein Docker-Container ausgeführt wird. Ich habe sogar versucht, ihn neu zu starten, aber sobald ich versucht habe, eine Sitzung dafür mit New-PSSession -ContainerId $containerId -RunAsAdministratorzu erstellen, ist ein Fehler aufgetreten, der besagt:

## [Fehler] New-PSSession: Die Eingabe ContainerId xxx existiert nicht, ## [Fehler] oder der entsprechende Container wird nicht ausgeführt.

Mein Problem war, dass ich mit einem Netzwerkdienst ausgeführt wurde und dieser nicht über genügend Berechtigungen zum Anzeigen des Containers verfügte, obwohl ich ihm Berechtigungen zum Ausführen von Docker-Befehlen (mit Docker-Sicherheitsgruppenkonfiguration) erteilt hatte.

Ich wusste nicht, wie ich die Arbeit mit Containern aktivieren sollte, daher musste ich sie stattdessen als Administrator ausführen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.