Używam dokowanego kontenera mongo.Zainicjalizuj dane dotyczące dokowanego Mongo
Chciałbym utworzyć obraz mongo z niektórymi zainicjowanymi danymi.
Wszelkie pomysły?
Używam dokowanego kontenera mongo.Zainicjalizuj dane dotyczące dokowanego Mongo
Chciałbym utworzyć obraz mongo z niektórymi zainicjowanymi danymi.
Wszelkie pomysły?
Najpierw utworzyć wolumin Döcker
docker volume create --name mongostore
następnie stworzyć swój pojemnik Mongo
docker run -d --name mongo -v mongostore:/data/db mongo:latest
-v
przełącznik tutaj jest odpowiedzialny za montaż głośność mongostore
w miejscu /data/db
, czyli tam, gdzie Mongo oszczędza ITS dane. Wolumin jest trwały (na hoście). Nawet bez pojemniki uruchomiony widać swoją objętość mongostore wymienione przez
docker volume ls
Można zabić pojemnik i utworzyć nowy (tej samej linii, jak wyżej) oraz nowy pojemnik Mongo podniesie stanu poprzedniego pojemnika .
Inicjowanie woluminu Mongo inicjuje nową bazę danych, jeśli żadna nie jest obecna. Jest to odpowiedzialne za tworzenie początkowych danych w mongostorze. Załóżmy, że chcesz stworzyć zupełnie nowe środowisko przy użyciu wstępnie rozstawionej bazy danych. Problem polega na przeniesieniu danych z lokalnego środowiska (na przykład) do wolumenu przed utworzeniem kontenera mongo. Wymienię dwa przypadki.
środowisko lokalne
Używasz albo Docker dla Mac/Windows lub Docker Toolbox. W takim przypadku można łatwo podłączyć dysk lokalny do tymczasowego kontenera, aby zainicjować wolumin. Np .:
To nie działa w przypadku przechowywania w chmurze. W takim przypadku musisz skopiować pliki.
Zdalne środowisko (AWS, GCP, Azure, ...)
To dobry pomysł, aby smoły/skompresować rzeczy, aby przyspieszyć przesyłanie.
tar czf mongodata.tar.gz /Users/myname/work/mongodb
Następnie utwórz tymczasowy pojemnik do usunięcia i kopiowania plików do mongostora. tail -f /dev/null
tylko upewnia się, że pojemnik nie wychodzi.
docker run -d --name temp -v mongostore:/data alpine:3.4 tail -f /dev/null
Kopiowanie plików do niego
docker cp mongodata.tar.gz temp:.
rozpakować i przenieść do objętości
docker exec temp tar xzf mongodata.tar.gz && cp -rp mongodb/* /data
Cleanup
docker rm temp
Można również skopiować pliki do zdalnego hosta i montować stamtąd, ale staram się w ogóle unikać interakcji ze zdalnym hostem.
Zastrzeżenie. Piszę to z pamięci (bez testowania).
Już o tym myślałem. To dobre podejście, ale tworzę środowisko demo. Tak więc środowisko demo musi być w stanie skonfigurować na dowolnym komputerze, który chcemy.Rozwiązaniem byłoby utworzenie woluminu danych jako obrazu i wyciągnięcie go. Czy to możliwe? – Jordi
Dodam więcej informacji o inicjowaniu danych woluminu, o co prosisz. – Alkaline
Idealnie! Jaka jest zawartość przychodzącego ot 'mongodata.tar.gz'. Chyba chcę utworzyć bazę danych 'dbOne' i dwie kolekcje' col1' i 'col2' i wstawić do nich trochę danych. Jak miałbym to zrobić? – Jordi
Znalazłem sposób, który jest dla mnie łatwiejszy.
Załóżmy, że masz bazę danych w kontenerze Docker na swoim serwerze i jeśli chcesz utworzyć kopię zapasową, oto, co możesz zrobić.
To, co może się różnić od konfiguracji do mojej, to nazwa kontenera dokującego Mongo [mongodb
] (domyślnie w przypadku korzystania z elastic_spence
). Więc upewnij się rozpocząć swój pierwszy pojemnik z --name mongodb
dopasować następujące kroki:
$ docker run \
--rm \
--link mongodb:mongo \
-v /root:/backup \
mongo \
bash -c ‘mongodump --out /backup --host $MONGO_PORT_27017_TCP_ADDR’
i przywrócenia bazy danych z wysypiska.
$ docker run \
--rm \
--link mongodb:mongo \
-v /root:/backup \
mongo \
bash -c ‘mongorestore /backup --host $MONGO_PORT_27017_TCP_ADDR’
Jeśli trzeba pobrać zrzut ze na serwerze można użyć SCP:
$ scp -r [email protected]:/root/backup ./backup
Lub przesłać go:
$ scp -r ./backup [email protected]:/root/backup
PS: Pierwotne źródło Tim Brandin dostępny https://blog.studiointeract.com/mongodump-and-mongorestore-for-mongodb-in-a-docker-container-8ad0eb747c62
Dziękujemy!
bardziej samowystarczalny podejście:
Istnieje wiele odpowiedzi, które korzystają jednorazowy pojemniki lub utworzyć woluminy i połączyć je, ale wydaje się to zbyt skomplikowane. Jeśli spojrzysz na obraz docker-entrypoint.sh mongo docker, zobaczysz, że wiersz 206 wykonuje pliki /docker-entrypoint-initdb.d/*.js
podczas inicjalizacji, używając składni: mongo <db> <js-file>
.Jeśli utworzysz pochodzący MongoDB Döcker obraz, który zawiera dane nasion można:
Takie podejście jest szczególnie dobrze nadaje się do:
Jak:
Tworzenie Dockerfile dla pochodzącego obrazu, który kopiuje twoje skrypty startowe
FROM mongo:3.4
COPY seed-data.js /docker-entrypoint-initdb.d/
Zbuduj Döcker obraz
docker build -t mongo-sample-data:3.4 .
Opcjonalnie push obrazu do rejestru Döcker aby inni mogli używać
Uruchom obraz dokowania
docker run \
--name mongo-sample-data \
-p 27017:27017 \
--restart=always \
-e MONGO_INITDB_DATABASE=application \
-d mongo-sample-data:3.4
Domyślnie docker-entrypoint.sh zastosuje twoje skrypty do test
db; powyższe polecenie run env var MONGO_INITDB_DATABASE=application
zastosuje te skrypty zamiast application
db. Alternatywnie możesz utworzyć i przełączyć się do różnych plików dbs w pliku js.
Mam repozytorium github, które robi właśnie to - tutaj są relevant files.
Absolutnie nie mam pojęcia. O ile udało mi się wymyślić, mógłbym spróbować z dokowanej powłoki 'sudo docker exec -it mongo mongo'. Jednak za każdym razem muszę ponownie zrzucić wszystkie dane. – Jordi
Musisz uruchomić poprzednio utworzony kontener, aby uzyskać te same dane, co poprzednio. W przeciwnym razie dokowanie tworzy nowy kontener ze świeżą bazą danych, patrz [ta odpowiedź] (http://stackoverflow.com/questions/39289394/mysql-databases-are-gone-when-the-ocker-container-is-shutdown/39289787 # 39289787) – n2o
Istnieje dobra dyskusja na ten temat, z sugestią uruchamiania mongoimport w jednorazowym pojemniku do rozsiewania bazy danych, pod adresem http://stackoverflow.com/a/33397913/174843 –