Wie Sie Daten in einer dockerisierten Postgres-Datenbank mit Volumes persistieren
Meine docker compose-Datei hat drei Container, web, nginx und postgres. Postgres sieht so aus:
postgres:
container_name: postgres
restart: always
image: postgres:latest
volumes:
- ./database:/var/lib/postgresql
ports:
- "5432:5432
Mein Ziel ist mount eine volume-das entspricht einem lokalen Ordner namens ./database
innerhalb der postgres-container als /var/lib/postgres
. Wenn ich beginne, diese Container und einfügen von Daten in postgres, die ich stellen Sie sicher, dass /var/lib/postgres/data/base/
ist voll von Daten, die ich hinzufüge (in der postgres-container), aber in meinem lokalen system, ./database
bekommt nur eine data
Ordner, d.h. ./database/data
erstellt wird, aber es ist leer. Warum?
Hinweise:
- Dies deutet darauf hin meine oben angegebenen Datei funktionieren sollte.
- Diese person ist mit docker Dienstleistungen, die interessant ist
UPDATE 1
Pro Nick ' s Vorschlag, ich habe ein docker inspect
und gefunden:
"Mounts": [
{
"Source": "/Users/alex/Documents/MyApp/database",
"Destination": "/var/lib/postgresql",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
"Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
"Destination": "/var/lib/postgresql/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
Macht es scheinen, wie die Daten gestohlen von einem anderen volume habe ich nicht code selbst. Nicht sicher, warum das so ist. Ist der postgres-Bild erstellen, dass die Lautstärke für mich? Wenn ja, gibt es eine Möglichkeit zur Nutzung , volume statt das volume mounte ich, wenn ich neu starten? Ansonsten ist es eine gute Möglichkeit zu deaktivieren, dass andere Volumen und mit meinen eigenen, ./database
?
UPDATE 2
Ich die Lösung gefunden, vielen Dank an Nick! (und ein anderer Freund) Antwort unten.
initdb
- Befehlszeile, die zum starten Ihres Datenbank-cluster? aus dem app-import-db
und db.create_all()
aus docker run
nach dem starten der Container. Ich weiß nicht initdb
direkt aus der Kommandozeile. sudo su -
und suchen Sie in ./Datenbank/data
. Es gibt nichts in es, soweit ich das sagen kann. InformationsquelleAutor der Frage Alex Lenail | 2017-01-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seltsam genug, die Lösung gelandet zu ändern
zu
InformationsquelleAutor der Antwort Alex Lenail
Können Sie erstellen eine gemeinsame Volumen für alle Postgres-Daten
oder man kann Sie auf der compose-Datei
Wird es erstellen der volume-name pgdata und montieren Sie das Volumen des Containers Weg.
Sie überprüfen können, dieses Volumen
InformationsquelleAutor der Antwort Nishchit Dhanani
Würde ich vermeiden, über einen relativen Pfad. Denken Sie daran, dass docker ist ein daemon/client-Beziehung.
Wenn Sie die Ausführung der zu Komponieren, es ist im Grunde nur brechen in verschiedene docker-client-Befehle, die dann an den daemon übergeben. Dass
./database
ist dann relativ zu der daemon, nicht der client.Nun, die docker-dev-team hat einige hin und her zu diesem Thema, aber die bottom line ist, kann es einige unerwartete Ergebnisse.
Kurz gesagt, nicht mit einem relativen Pfad einen absoluten Pfad.
InformationsquelleAutor der Antwort Nick Burke
Ich denke, Sie müssen nur zu erstellen Sie Ihre Lautstärke außerhalb Andockfenster zunächst mit einem
docker create -v /location --name
- und dann wiederverwenden.Und durch die Zeit, die ich verwendet, um zu verwenden das Andockfenster eine Menge, es war nicht möglich, die Verwendung einer statischen Andockfenster Volumen mit dockerfile definition also mein Vorschlag ist, zu versuchen, die Befehlszeile (evtl. mit einem script ) .
InformationsquelleAutor der Antwort Joel B