Meine Docker-Erstellungsdatei enthält 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 es, ein Volume ./database
bereitzustellen, das einem lokalen Ordner entspricht, der im Postgres-Container als aufgerufen wird /var/lib/postgres
. Wenn ich diese Container starte und Daten in Postgres einfüge, überprüfe ich, ob /var/lib/postgres/data/base/
die Daten, die ich hinzufüge , voll sind (im Postgres-Container), aber in meinem lokalen System wird ./database
nur ein data
Ordner darin angezeigt , dh er ./database/data
wird erstellt, aber er ist leer . Warum?
Anmerkungen:
- Dies legt nahe, dass meine obige Datei funktionieren sollte.
- Diese Person nutzt Docker-Dienste, was interessant ist
UPDATE 1
Per Nicks Vorschlag habe ich ein gemacht docker inspect
und festgestellt:
"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": ""
}
],
Was den Anschein erweckt, als würden die Daten von einem anderen Volume gestohlen, das ich selbst nicht codiert habe. Ich bin mir nicht sicher, warum das so ist. Erstellt das Postgres-Bild dieses Volumen für mich? Wenn ja, gibt es eine Möglichkeit, dieses Volume anstelle des Volumes zu verwenden , das ich beim Neustart bereitstelle? Gibt es sonst eine gute Möglichkeit, dieses andere Volume zu deaktivieren und mein eigenes zu verwenden ./database
?
UPDATE 2
Ich habe die Lösung gefunden, danke an Nick! (und ein anderer Freund) Antworte unten.
quelle
initdb
Befehlszeile aus, um Ihren Datenbankcluster zu initialisieren?from app import db
unddb.create_all()
von einemdocker run
nach dem Start die Container. Ich nichtinitdb
direkt von der Kommandozeile.sudo su -
und nachsehen soll./database/data
. Soweit ich das beurteilen kann, ist dort nichts drin.Antworten:
Seltsamerweise bestand die Lösung darin, sich zu ändern
zu
quelle
/var/lib/postgresql/data
- Sie können die PGDATA-Variablennotizen hier lesen: store.docker.com/images/….dockerignore
Fügen Sie das lokale Verzeichnis zu Ihrer Datei hinzu, insbesondere wenn Sie dies jemals in ein Produktionsabbild zerlegen. Eine Diskussion finden Sie unter codefresh.io/blog/not-ignore-dockerignore .docker rm my_postgres_container_1
bevor es funktionierte (auch High Sierra).Sie können ein gemeinsames Volume für alle Postgres-Daten erstellen
oder Sie können es auf die Erstellungsdatei setzen
Es werden Datenträgernamen pgdata erstellt und dieses Datenträger in den Pfad des Containers .
Sie können dieses Volumen überprüfen
quelle
docker-compose down -v
. Und was ist die Lösung dafür?docker-compose down --rmi all
ohne die-v
Option , und es wird klar aus „alles“ außer der Volumina, dh Behälter, Netzwerke, Bilder usw. ich, dass bei der Bereitstellung während Datenpersistenz ermöglicht.Ich würde es vermeiden, einen relativen Pfad zu verwenden. Denken Sie daran, dass Docker eine Daemon / Client-Beziehung ist.
Wenn Sie das Compose ausführen, wird es im Wesentlichen nur in verschiedene Docker-Client-Befehle zerlegt, die dann an den Daemon übergeben werden. Das
./database
ist dann relativ zum Daemon , nicht zum Client.Jetzt hat das Docker-Entwicklerteam einige Probleme mit diesem Problem , aber unter dem Strich kann es zu unerwarteten Ergebnissen kommen.
Kurz gesagt, verwenden Sie keinen relativen Pfad, sondern einen absoluten Pfad.
quelle
database/data
Ordner immer noch leer = (docker inspect
den Container ausführen und sicherstellen, dass der Container das Volumen kennt (nur für den Fall, dass das Verfassen verwirrt ist oder so). (Hinweis: Docker Inspect kann vertrauliche Daten enthalten. Fügen Sie diese also nicht ohne Munging hier ein. ;-) Danach müssen die Berechtigungen überprüft werden (obwohl dies normalerweise einen Fehler anzeigen würde)Ich denke, Sie müssen Ihr Volume nur außerhalb von Docker erst mit einem erstellen
docker create -v /location --name
und dann wiederverwenden.Und als ich Docker oft benutzte, war es nicht möglich, ein statisches Docker-Volume mit Docker-Dateidefinition zu verwenden. Mein Vorschlag ist daher, die Befehlszeile (eventuell mit einem Skript) auszuprobieren.
quelle