467 Stimmen

Ich verliere meine Daten, wenn der Container beendet wird.

Trotz des interaktiven Tutorials von Docker Interactive tutorial und faq verliere ich meine Daten, wenn der Container beendet wird.

Ich habe Docker installiert, wie hier beschrieben: http://docs.docker.io/en/latest/installation/ubuntulinux ohne Probleme auf Ubuntu 13.04.

Aber es verliert alle Daten beim Beenden.

iman@test:~$ sudo docker version
Client version: 0.6.4 
Go version (client): go1.1.2 
Git commit (client): 2f74b1c 
Server version: 0.6.4 
Git commit (server): 2f74b1c 
Go version (server): go1.1.2 
Last stable version: 0.6.4 

iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:05:47 Unable to locate ping 
iman@test:~$ sudo docker run ubuntu apt-get install ping
Reading package lists... 
Building dependency tree... 
The following NEW packages will be installed: 
  iputils-ping 
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. 
Need to get 56.1 kB of archives. 
After this operation, 143 kB of additional disk space will be used. 
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB] 
debconf: delaying package configuration, since apt-utils is not installed 
Fetched 56.1 kB in 0s (195 kB/s) 
Selecting previously unselected package iputils-ping. 
(Reading database ... 7545 files and directories currently installed.) 
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ... 
Setting up iputils-ping (3:20101006-1ubuntu1) ... 
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:06:11 Unable to locate ping 
iman@test:~$ sudo docker run ubuntu touch /home/test
iman@test:~$ sudo docker run ubuntu ls /home/test
ls: cannot access /home/test: No such file or directory 

Ich habe es auch mit interaktiven Sitzungen getestet, mit demselben Ergebnis. Habe ich etwas vergessen?

BEARBEITEN: WICHTIG FÜR NEUE DOCKER-BENUTZER

Wie @mohammed-noureldin und andere sagten, handelt es sich tatsächlich NICHT um einen Container-Austritt. Jedes Mal wird einfach ein neuer Container erstellt.

15voto

Magnus Melwin Punkte 1501

Ich habe eine viel einfachere Antwort auf deine Frage, führe die folgenden beiden Befehle aus

sudo docker run -t -d ubuntu --name mycontainername /bin/bash
sudo docker ps -a

Der oben genannte ps -a Befehl liefert eine Liste aller Container zurück. Nimm den Namen des Containers, der auf den Bildnamen verweist - 'ubuntu'. Docker generiert automatisch Namen für die Container, zum Beispiel - 'lightlyxuyzx', das passiert, wenn du die --name Option nicht verwendest.

Die Optionen -t und -d sind wichtig, der erstellte Container ist abgetrennt und kann mit der -t Option wieder angehängt werden.

Mit der --name Option kannst du deinen Container benennen, in meinem Fall 'mycontainername'.

sudo docker exec -ti mycontainername bash

und dieser obige Befehl hilft dir, dich mit dem Container über die Bash-Shell anzumelden. Von diesem Punkt an werden alle Änderungen, die du im Container vornimmst, automatisch von Docker gespeichert. Zum Beispiel - apt-get install curl im Container Du kannst den Container ohne Probleme verlassen, Docker speichert automatisch die Änderungen.

Beim nächsten Gebrauch musst du nur diese beiden Befehle ausführen, wenn du mit diesem Container arbeiten möchtest.

Dieser unten stehende Befehl startet den gestoppten Container:

sudo docker start mycontainername

sudo docker exec -ti mycontainername bash

Ein weiteres Beispiel mit Ports und einem gemeinsamen Speicherplatz findest du unten:

docker run -t -d --name mycontainername -p 5000:5000 -v ~/PROJECTS/SPACE:/PROJECTSPACE 7efe2989e877 /bin/bash

In meinem Fall: 7efe2989e877 - ist die Image-ID eines zuvor ausgeführten Containers die ich erhalten habe durch

docker ps -a

8voto

Sie sollten sich Docker-Volumes ansehen, wenn Sie die Daten in Ihrem Container dauerhaft speichern möchten. Besuchen Sie https://docs.docker.com/engine/tutorials/dockervolumes/. Die Docker-Dokumentation ist ein sehr guter Ausgangspunkt.

4voto

Cam T Punkte 1705

Mein Vorschlag ist es, Docker mit Docker Compose zu verwalten. Es ist ein einfacher Weg, um alle Docker-Container für Ihr Projekt zu verwalten, Sie können die Versionen zuordnen und verschiedene Container verknüpfen, um zusammenzuarbeiten.

Die Dokumentation ist sehr einfach zu verstehen, besser als die Docker-Dokumentation.

Docker-Compose Dokumente

Beste Grüße

1voto

Oleg Kokorin Punkte 1668

Das ähnliche Problem (und keine Möglichkeit, es allein mit dem Dockerfile zu beheben) hat mich auf diese Seite gebracht.

Phase 0: für alle, die gehofft haben, dass das Dockerfile es lösen könnte: Bis --dns und --dns-search im Dockerfile unterstützt werden - gibt es keine Möglichkeit, intranetbasierte Ressourcen zu integrieren.

Phase 1: Nachdem das Bild mit dem Dockerfile erstellt wurde (übrigens ein ernsthaftes Problem, das Dockerfile muss sich im aktuellen Ordner befinden), indem man ein Bild bereitstellt, das auf dem Intranet basiert, indem man das Docker-Run-Skript ausführt. Beispiel: docker run -d \ --dns=${DNSLOCAL} \ --dns=${DNSGLOBAL} \ --dns-search=intranet \ -t pack/bsp \ --name packbsp-cont \ bash -c " \ wget -r --no-parent http://intranet/intranet-content.tar.gz \ tar -xvf intranet-content.tar.gz \ sudo -u ${USERNAME} bash --norc"

Phase 2: Anwendung des Docker-Run-Skripts im Dämonenmodus, indem lokale DNS-Einträge bereitgestellt werden, um die Möglichkeit zu haben, lokale Sachen herunterzuladen und bereitzustellen.

Wichtiger Punkt: Das Ausführungsskript sollte mit etwas Ähnlichem wie /usr/bin/sudo -u ${USERNAME} bash --norc enden, um den Container auch nach Abschluss der Installations-Skripte weiter laufen zu lassen.

Nein, es ist nicht möglich, den Container im Interaktionsmodus auszuführen, wenn es um die Automatisierung geht, da er solange im internen Shell-Befehlsfenster bleiben wird, bis STRG-p STRG-q gedrückt wird.

Nein, wenn das interagierende Bash nicht am Ende des Installationsskripts ausgeführt wird, wird der Container unmittelbar nach Abschluss der Skriptausführung beendet und alle Installationsergebnisse gehen verloren.

Phase 3: Der Container läuft immer noch im Hintergrund, aber es ist unklar, ob der Installationsvorgang bereits abgeschlossen ist oder nicht. Verwenden Sie den folgenden Block, um den Abschluss des Vorgangs festzustellen: while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done Das Skript wird erst weiter fortgesetzt, nachdem die Installation abgeschlossen ist. Und das ist der richtige Zeitpunkt, um commit aufzurufen, indem die aktuelle Container-ID sowie der Zielbildname bereitgestellt werden (es kann derselbe Name wie beim Build/Run-Vorgang sein, aber mit dem Tag für die lokale Installationszwecke ergänzt). Beispiel: docker commit containerID pack/bsp:toolchained. Siehe diesen Link, um die passende Container-ID zu erhalten.

Phase 4: Der Container wurde mit den lokalen Installationen aktualisiert und in das neu zugewiesene Bild (dasjenige mit dem hinzugefügten Zweck-Tag) überführt. Es ist jetzt sicher, den laufenden Container anzuhalten. Beispiel: docker stop packbsp-cont

Phase 5: Jederzeit, wenn der Container mit lokalen Installationen ausgeführt werden muss, starten Sie ihn mit dem zuvor gespeicherten Bild. Beispiel: docker run -d -t pack/bsp:toolchained

1voto

barlop Punkte 11355

Eine brillante Antwort hier Wie kann man einen beendeten Docker weiterführen von Benutzer kgs

docker start $(docker ps -a -q --filter "status=exited")
(oder in diesem Fall einfach docker start $(docker ps -ql), weil Sie nicht alle starten möchten)

docker exec -it  /bin/bash

Diese zweite Zeile ist entscheidend. Also wird `exec` anstelle von `run` verwendet und nicht auf einem Image, sondern auf einer Container-ID. Und Sie führen es aus, nachdem der Container gestartet wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X