Mój plik komponowania dokera ma trzy kontenery, web, nginx i postgres. Postgres wygląda następująco:
postgres:
container_name: postgres
restart: always
image: postgres:latest
volumes:
- ./database:/var/lib/postgresql
ports:
- "5432:5432
Moim celem jest zamontowanie woluminu odpowiadającego folderowi lokalnemu o nazwie ./database
wewnątrz kontenera postgres as /var/lib/postgres
. Kiedy uruchamiam te kontenery i wstawiam dane do postgres, sprawdzam, czy /var/lib/postgres/data/base/
jest pełne danych, które dodaję (w kontenerze postgres), ale w moim systemie lokalnym ./database
dostaje tylko data
folder, tzn. ./database/data
Jest tworzony, ale jest pusty . Czemu?
Uwagi:
- To sugeruje, że mój powyższy plik powinien działać.
- Ta osoba korzysta z usług dokerów, co jest interesujące
AKTUALIZACJA 1
Zgodnie z sugestią Nicka zrobiłem docker inspect
i znalazłem:
"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": ""
}
],
Co sprawia, że wygląda na to, że dane są kradzione przez inny wolumin, którego sam nie kodowałem. Nie jestem pewien, dlaczego tak jest. Czy obraz postgres tworzy dla mnie ten wolumin? Jeśli tak, to czy jest jakiś sposób na użycie tego woluminu zamiast woluminu, który instaluję po ponownym uruchomieniu? W przeciwnym razie, czy istnieje dobry sposób na wyłączenie tego innego woluminu i użycie własnego ./database
?
AKTUALIZACJA 2
Znalazłem rozwiązanie, dzięki Nickowi! (i inny przyjaciel) Odpowiedz poniżej.
źródło
initdb
wiersz poleceń, aby zainicjować klaster bazy danych?from app import db
idb.create_all()
od Adocker run
po uruchomieniu pojemników. Nieinitdb
bezpośrednio z wiersza poleceń.sudo su -
i zajrzeć./database/data
. O ile mi wiadomo, nic tam nie ma.Odpowiedzi:
O dziwo, rozwiązanie ostatecznie uległo zmianie
do
źródło
/var/lib/postgresql/data
- notatki ze zmiennymi PGDATA można znaleźć tutaj: store.docker.com/images/….dockerignore
pliku, szczególnie jeśli kiedykolwiek przycinasz go do obrazu produkcyjnego. Zobacz codefresh.io/blog/not-ignore-dockerignore do dyskusji.docker rm my_postgres_container_1
zanim to zadziałało (także High Sierra).Możesz utworzyć wspólny wolumin dla wszystkich danych Postgres
lub możesz ustawić go na plik tworzenia
Utworzy wolumin o nazwie pgdata i zamontuje ten wolumin na ścieżce kontenera.
Możesz sprawdzić ten wolumin
źródło
docker-compose down -v
. A jakie jest na to rozwiązanie?docker-compose down --rmi all
bez tej-v
opcji i będzie ona pozbyć się „wszystko” z wyjątkiem wielkości, czyli pojemniki, sieci, obrazy, itd. To zrobić podczas wdrażania jednocześnie umożliwiając utrzymywanie danych.Unikałbym używania ścieżki względnej. Pamiętaj, że doker jest relacją demon / klient.
Kiedy wykonujesz komponowanie, zasadniczo dzieli się ono na różne polecenia klienta dokera, które są następnie przekazywane do demona. Jest
./database
to następnie względne względem demona , a nie klienta.Obecnie zespół deweloperów dokerów ma w tej kwestii trochę do przodu , ale najważniejsze jest to, że może przynieść nieoczekiwane rezultaty.
Krótko mówiąc, nie używaj ścieżki względnej, użyj ścieżki bezwzględnej.
źródło
database/data
folder jest nadal pusty = (docker inspect
kontenera i upewnienie się, że kontener jest świadomy woluminu (na wypadek gdyby kompozycja była pomylona lub coś takiego). (uwaga: inspekcja dokerów może mieć wrażliwe dane, więc nie wklejaj ich tutaj bez mungowania ;-) Potem chodzi o sprawdzenie uprawnień (chociaż zwykle to pokazuje błąd)Myślę, że najpierw musisz utworzyć wolumin poza dokerem,
docker create -v /location --name
a następnie użyć go ponownie.Do czasu kiedy często używałem Dockera, nie było możliwe użycie statycznego woluminu Dockera z definicją pliku Docker, więc sugeruję wypróbowanie wiersza poleceń (ewentualnie ze skryptem).
źródło
Miałem ten sam problem od wielu dni. Mój przypadek był po prostu literówką: „postgresql” ma tylko jeden „s”, napisałem dwa (postgressql): $.
źródło