web-dev-qa-db-de.com

Wie mounte ich ein Verzeichnis in einem Docker-Container auf dem Host?

Angenommen, ich habe eine Anwendung mit diesem einfachen Dockerfile:

//...
RUN configure.sh --logmyfiles /var/lib/myapp
ENTRYPOINT ["starter.sh"]
CMD ["run"]
EXPOSE 8080
VOLUME ["/var/lib/myapp"]

Und davon laufe ich einen Container:

Sudo docker run -d --name myapp -p 8080:8080 myapp:latest

So funktioniert es richtig und speichert einige Protokolle in /var/lib/myapp des Docker-Containers.

Meine Frage

Ich benötige diese Protokolldateien, um sie auch automatisch im Host zu speichern. Wie kann ich also das /var/lib/myapp vom Container zum /var/lib/myapp auf dem Hostserver (ohne den aktuellen Container zu entfernen)?

Bearbeiten

Ich sehe auch Docker - Mount Directory vom Container zum Host , aber es löst mein Problem nicht. Ich brauche eine Möglichkeit, meine Dateien vom Docker zum Host zu sichern.

19
Saeed Masoumi

Zunächst ein paar Informationen zu Docker-Volumes . Volume-Bereitstellungen erfolgen nur zum Zeitpunkt der Containererstellung. Das bedeutet, dass Sie die Volume-Bereitstellungen nicht mehr ändern können, nachdem Sie den Container gestartet haben. Volume-Bereitstellungen sind nur in eine Richtung möglich: Vom Host zum Container und nicht umgekehrt. Wenn Sie ein Host-Verzeichnis angeben, das als Volume in Ihrem Container eingebunden ist (zum Beispiel: docker run -d --name="foo" -v "/path/on/Host:/path/on/container" ubuntu), es ist ein "normaler alter" Linux mount --bind, was bedeutet, dass das Host-Verzeichnis das Containerverzeichnis vorübergehend "überschreibt". Im Zielverzeichnis wird nichts gelöscht oder überschrieben. Aufgrund der Art der Container bedeutet dies jedoch, dass sie für die gesamte Lebensdauer des Containers überschrieben werden.

Sie haben also zwei Möglichkeiten (vielleicht drei). Sie könnten ein Host-Verzeichnis in Ihren Container mounten und diese Dateien dann in Ihr Startskript kopieren (oder wenn Sie cron in Ihren Container bringen , könnten Sie ein cron verwenden, um diese Dateien in regelmäßigen Abständen auf dieses Host-Verzeichnis-Volume zu kopieren montieren).

Sie könnten auch docker cp, um Dateien von Ihrem Container auf Ihren Host zu verschieben. Das ist ein bisschen hacky und definitiv nichts, was Sie in Ihrer Infrastrukturautomatisierung verwenden sollten. Aber es funktioniert genau zu diesem Zweck sehr gut. Einmalig oder Debuggen ist dafür eine großartige Situation.

Möglicherweise können Sie auch eine Netzwerkübertragung einrichten, dies ist jedoch für Ihre Arbeit sehr wichtig. Wenn Sie dies jedoch regelmäßig für Ihre Protokolldateien (oder was auch immer) tun möchten, können Sie die Verwendung von rsyslog in Betracht ziehen, um diese Dateien aus Ihrem Container zu verschieben.

18
L0j1k

Also, wie kann ich die/var/lib/myapp aus dem Container in die/var/lib/myapp im Host-Server einhängen

Das ist das Gegenteil: Sie können einen Host-Ordner auf docker run In Ihren Container mounten .

(ohne den aktuellen Container zu entfernen)

Ich glaube nicht.
Im Moment können Sie docker inspect <containername> prüfen und sehen, ob Ihr Protokoll im /var/lib/docker/volumes/... Angezeigt wird, das dem Volumen Ihres Containers zugeordnet ist.

Oder Sie können das Ergebnis von docker logs <containername> in eine Host-Datei umleiten.
Weitere Beispiele finden Sie unter this Gist .

Die Alternative wäre, ein Host-Verzeichnis als Protokollordner bereitzustellen und dann direkt auf dem Host auf die Protokolldateien zuzugreifen.

[email protected]~$ docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <certs-dir>:/etc/nginx/certs -v <log-dir>:/var/log/nginx dockerfile/nginx

[email protected]~$ ls <log-dir> 

(Auch dies gilt für einen Container, den Sie starten, und nicht für einen vorhandenen, der ausgeführt wird.)

2
VonC