Jak zalać bazę danych mongo używając docker-compose?

Próbuję rozpowszechnić zestaw połączonych aplikacji działających w kilku połączonych kontenerach, które zawierają bazę danych mongo, która jest wymagana do:

  • być dystrybuowane zawierające niektóre dane nasion;
  • Zezwalaj użytkownikom na dodawanie dodatkowych danych.

Najlepiej, gdy dane będą przechowywane w powiązanym pojemniku objętości danych.

Mogę pobrać dane do kontenera mongo za pomocą instancji bazowej mongo, która nie montuje żadnych woluminów (obraz dockerhub: psychemedia/mongo_nomount - jest to zasadniczo podstawowy plik Dockerfile mongo bez instrukcji VOLUME /data/db) i Dockerfile config w następujący sposób:

ADD . /files
WORKDIR /files
RUN mkdir -p /data/db && mongod --fork --logpath=/tmp/mongodb.log && sleep 20 && \
mongoimport  --db testdb --collection testcoll  --type csv --headerline --file ./testdata.csv  #&& mongod --shutdown

Gdzie ./testdata.csv znajduje się w tym samym katalogu (./mongo-with-data) co plik Dockerfile.

Mój plik konfiguracyjny docker-compose zawiera:

mongo:
  #image: mongo
  build: ./mongo-with-data
  ports:
    - "27017:27017"
  #Ideally we should be able to mount this against a host directory
  #volumes:
  #  - ./db/mongo/:/data/db
  #volumes_from:
  #  - devmongodata

#devmongodata:
#    command: echo created
#    image: busybox
#    volumes: 
#       - /data/db

Kiedy próbuję zamontować wolumin, wydaje się, że oryginalne dane zasiane - które są przechowywane w /data/db - są usuwane. Myślę, że kiedy wolumin jest zamontowany do /data/db zastępuje to, co jest obecnie.

To powiedziawszy, Docker userguide sugeruje, że: woluminy są inicjalizowane podczas tworzenia kontenera. Jeśli obraz bazowy kontenera zawiera dane w określonym punkcie montowania, to istniejące dane są kopiowane do nowego woluminu po inicjalizacji woluminu? Więc spodziewałem się, że dane będą się utrzymywać, jeśli umieściłem polecenie VOLUME po poleceniu seeding RUN?

Więc co robię źle?

Długi widok jest taki, że chcę zautomatyzować budowę kilka połączonych kontenerów, a następnie rozprowadzić Vagrantfile/docker-compose plik YAML, który odpali zestaw połączonych aplikacji, który zawiera wstępnie osadzoną bazę danych mongo z (częściowo wstępnie wypełnionym) trwałym kontenerem danych.

Author: psychemedia, 2015-07-03

6 answers

Robię to używając innego kontenera Dockera, którego jedynym celem jest wysiew mongo, a następnie wyjście. Podejrzewam, że jest to ten sam pomysł co ebaxt ' s, ale kiedy szukałem odpowiedzi na to, chciałem tylko zobaczyć szybki i brudny, ale prosty przykład. Więc tu jest mój:

Docker-compose.yml

mongodb:
  image: mongo
  ports:
    - "27017:27017"

mongo-seed:
  build: ./mongo-seed
  links:
    - mongodb

# my webserver which uses mongo (not shown in example)
webserver:
  build: ./webserver
  ports:
    - "80:80"
  links:
    - mongodb

Mongo-seed / Dockerfile

FROM mongo

COPY init.json /init.json
CMD mongoimport --host mongodb --db reach-engine --collection MyDummyCollection --type json --file /init.json --jsonArray

Mongo-nasiona/init.json

[
  {
    "name": "Joe Smith",
    "email": "[email protected]",
    "age": 40,
    "admin": false
  },
  {
    "name": "Jen Ford",
    "email": "[email protected]",
    "age": 45,
    "admin": true
  }
]
 65
Author: Jeff Fairley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:02

Oto writeup jak używamy jednorazowych pojemników do czyszczenia i nasion obrazów https://ardoq.com/delightful-database-seeding-with-docker/

 3
Author: ebaxt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-19 08:34:13

Możesz użyć tego Obrazu , który zapewnia kontener docker dla wielu zadań (import, eksport , zrzut)

Spójrz na przykład używając docker-compose

 0
Author: bwnyasse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 08:24:45

Na własne pytanie:

  • prosty plik YAML do tworzenia prostego kontenera mongo połączonego z kontenerem objętości danych, uruchamianego przez Vagrant docker compose.
  • w pliku Vagrantfile, kod w linii:

config.vm.provision :shell, :inline => <<-SH docker exec -it -d vagrant_mongo_1 mongoimport --db a5 --collection roads --type csv --headerline --file /files/AADF-data-minor-roads.csv SH

Aby zaimportować dane.

Spakuj pudełko.

Rozprowadź pudełko.

Dla użytkownika, prosty Vagrantfile do załadowania pudełka i uruchomienia prostego skryptu docker-compose YAML do uruchomienia kontenerów i zamontowania Mongo db przeciwko pojemnikowi objętości danych.

 0
Author: psychemedia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-10 21:25:25

Możesz użyć Mongo Seeding Docker image .

Dlaczego?
  • masz gotowy obraz dokera
  • nie jesteś przywiązany do plików JSON - obsługiwane są również pliki JavaScript i TypeScript (w tym opcjonalna Walidacja modelu za pomocą TypeScript)

Przykładowe użycie z Dockerem Compose:

version: '3'
services:
  database:
    image: 'mongo:3.4.10'
    ports:
    - '27017:27017'
  api:
    build: ./api/
    command: npm run dev
    volumes: 
    - ./api/src/:/app/src/
    ports:
    - '3000:3000'
    - '9229:9229'
    links:
    - database
    depends_on:
    - database
    - data_import
    environment: 
    - &dbName DB_NAME=dbname
    - &dbPort DB_PORT=27017 
    - &dbHost DB_HOST=database
  data_import:
    image: 'pkosiec/mongo-seeding:latest'
    environment:
    - DROP_DATABASE=true
    - CONVERT_ID_TO_UNDERSCORE_ID=true
    - *dbName
    - *dbPort
    - *dbHost
    volumes:
    - ./data-import/data/dev/:/app/data/
    links:
    - database
    depends_on:
    - database

Zastrzeżenie: jestem autorem tej biblioteki.

 0
Author: pkosiec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-14 18:04:31

Przydało mi się używanie niestandardowych obrazów Dockera i używanie woluminów, zamiast tworzenia kolejnego kontenera do siewu.

Struktura Plików

.
├── docker-compose.yml
├── mongo
│   ├── data
│   ├── Dockerfile
│   └── init-db.d
│       └── seed.js

Każda lokalizacja pliku wymieniona w Dockerfile/docker-compose.yml, jest względem położenia docker-compose.yml

DOCKERFILE

FROM mongo:3.6

COPY ./init-db.d/seed.js /docker-entrypoint-initdb.d

Docker-compose.yml

version: '3'

services:
  db:
    build: ./mongo
    restart: always
    volumes:
      - ./mongo/data:/data/db #Helps to store MongoDB data in `./mongo/data`
    environment:
      MONGO_INITDB_ROOT_USERNAME: {{USERNAME}}
      MONGO_INITDB_ROOT_PASSWORD: {{PWD}}
      MONGO_INITDB_DATABASE: {{DBNAME}}

Nasiona.js

// Since Seeding in Mongo is done in alphabetical order... It's is important to keep
// file names alphabetically ordered, if multiple files are to be run.

db.test.drop();
db.test.insertMany([
  {
    _id: 1,
    name: 'Tensor',
    age: 6
  },
  {
    _id: 2,
    name: 'Flow',
    age: 10
  }
])

docker-entrypoint-initdb.d może być używany do tworzenia różnych użytkowników i mongodb sprawy związane z administracją, wystarczy utworzyć Alfabetycznie uporządkowany skrypt js do createUser itd...

Aby uzyskać więcej informacji na temat personalizacji usługi Docker MongoDB, przeczytaj this

Dobrze jest również chronić swoje hasła i nazwy użytkowników przed publicznością, nie naciskaj poświadczeń na publiczny git , zamiast tego używaj tajemnic dokera . Przeczytaj również ten Tutorial na temat sekretów

Należy pamiętać, nie jest konieczne, aby przejść do tryb Docker-swarm aby używać sekretów. Komponowanie plików obsługuje również tajemnice. Sprawdź to

Sekrety mogą być również używane w MongoDB Docker Services

 0
Author: Subroto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-09 04:03:32