2016-09-06 13 views
6

Używam dokowanego kontenera mongo.Zainicjalizuj dane dotyczące dokowanego Mongo

Chciałbym utworzyć obraz mongo z niektórymi zainicjowanymi danymi.

Wszelkie pomysły?

+0

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

+0

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

+0

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 –

Odpowiedz

1

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.

  1. ś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.

  2. 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).

+0

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

+0

Dodam więcej informacji o inicjowaniu danych woluminu, o co prosisz. – Alkaline

+0

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

0

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!

11

bardziej samowystarczalny podejście:

  • tworzyć pliki JavaScript, które zainicjować bazę
  • stworzyć pochodzący MongoDB Döcker obraz, który zawiera te pliki

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:

  • mieć jednego polecenia run doker że wstaje do Mongo z danymi nasiennych
  • mieć dane jest utrwalane przez przystanków pojemniku i zaczyna
  • przywrócić te dane z przystanku Döcker, RM, i komend
  • łatwo wdrożyć z planistami uruchomieniowych jak K8S, Mesos, rój, farmer

Takie podejście jest szczególnie dobrze nadaje się do:

  • antykoncepcji progestagenowej, że wystarczy kilka realistycznych danych do wyświetlania
  • rurociągi
  • CI/CD, które wymagają spójnych danych dla czarnej skrzynki testowania
  • przykładowych wdrożeń dla prezentacje produktów (inżynierów sprzedaży, właścicieli produkt)

Jak:

  1. Tworzenie i testowanie skryptów inicjalizacyjnych (w razie potrzeby przygotowanie danych)
  2. Tworzenie Dockerfile dla pochodzącego obrazu, który kopiuje twoje skrypty startowe

    FROM mongo:3.4 
    COPY seed-data.js /docker-entrypoint-initdb.d/ 
    
  3. Zbuduj Döcker obraz

    docker build -t mongo-sample-data:3.4 . 
    
  4. Opcjonalnie push obrazu do rejestru Döcker aby inni mogli używać

  5. 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.