UFO ET IT

docker-compose를 사용하여 mongo 데이터베이스를 어떻게 시드합니까?

ufoet 2020. 12. 30. 08:30
반응형

docker-compose를 사용하여 mongo 데이터베이스를 어떻게 시드합니까?


다음을 수행하는 데 필요한 mongo 데이터베이스를 포함하는 여러 연결된 컨테이너에서 실행되는 연결된 응용 프로그램 집합을 배포하려고합니다.

  • 일부 시드 데이터를 포함하는 배포
  • 사용자가 추가 데이터를 추가 할 수 있습니다.

이상적으로 데이터는 연결된 데이터 볼륨 컨테이너에도 유지됩니다.

볼륨을 마운트하지 않는 기본 인스턴스 (dockerhub 이미지 : -이것은 본질적으로 문이 없는 기본 mongo Dockerfile 임 )와 다음과 같은 구성을 mongo사용 하여 컨테이너에 데이터를 가져올 수 있습니다 .mongopsychemedia/mongo_nomountVOLUME /data/dbDockerfile

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

경우는 ./testdata.csv같은 디렉토리 (에 ./mongo-with-dataDockerfile 등).

내 docker-compose 구성 파일에는 다음이 포함됩니다.

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

VOLUME을 마운트하려고 할 때마다 원래 시드 데이터 (저장된) /data/db가 삭제 된 것처럼 보입니다 . 볼륨이 마운트되면 /data/db현재 존재하는 모든 것을 대체 한다고 생각합니다.

즉, docker 사용자 가이드 는 다음과 같이 제안합니다. 컨테이너가 생성 될 때 볼륨이 초기화됩니다. 컨테이너의 기본 이미지에 지정된 마운트 지점의 데이터가 포함되어 있으면 볼륨 초기화시 기존 데이터가 새 볼륨으로 복사 됩니까? 그래서 시드 RUN명령 뒤에 VOLUME 명령을 배치하면 데이터가 지속될 것으로 예상 했습니까?

그래서 내가 뭘 잘못하고 있니?

긴 관점은 연결된 여러 컨테이너의 빌드를 자동화 한 다음 Vagrantfile연결된 앱 집합을 실행 하는 / docker-compose YAML 파일 을 배포하려는 것입니다. 여기에는 mongo(부분적으로 미리 채워진 ) 영구 데이터 컨테이너.


mongo를 시드하고 종료하는 유일한 목적을 가진 다른 도커 컨테이너를 사용하여이 작업을 수행합니다. 나는 이것이 ebaxt 와 같은 생각이라고 생각 하지만 이것에 대한 답을 찾고있을 때 나는 빠르고 더럽지 만 간단한 예를보고 싶었습니다. 그래서 여기 내 것입니다.

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-seed / init.json

[
  {
    "name": "Joe Smith",
    "email": "jsmith@gmail.com",
    "age": 40,
    "admin": false
  },
  {
    "name": "Jen Ford",
    "email": "jford@gmail.com",
    "age": 45,
    "admin": true
  }
]

시드를 위해 다른 컨테이너를 만드는 대신 Docker 사용자 지정 이미지를 사용하고 볼륨을 사용하는 것이 유용하다는 것을 알았습니다.

파일 구조

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

Dockerfile/에 언급 된 모든 파일 위치 docker-compose.yml는 다음 위치를 기준으로합니다.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}}

seed.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다른 사용자 및 mongodb 관리 관련 항목을 만드는 데 사용할 수 있으며 js-scriptcreateUser 라는 알파벳 순서 등을 만듭니다 .

MongoDB를 도커 서비스를 사용자 정의하는 방법에 대한 자세한 내용은 읽기,

또한 비밀번호와 사용자 이름을 Public에서 안전하게 유지 하고 public git에 자격 증명을 푸시하지 말고 대신 Docker Secrets 를 사용하는 것이 좋습니다 . 비밀에 대한튜토리얼 도 읽어 보세요.

비밀을 사용하기 위해 docker-swarm 모드전환필요는 없습니다 . 파일 작성은 비밀도 지원합니다. 이것을 확인 하십시오

Secrets can also be used in MongoDB Docker Services


Here is a writeup of how we're using disposable containers to clean and seed images https://blog.ardoq.com/dynamic-database-seeding-with-docker


Current answer based on @Jeff Fairley answer and updated according to new Docker docs

docker-compose.yml

version: "3.5"

services:
  mongo:
    container_name: mongo_dev
    image: mongo:latest
    ports:
      - 27017:27017
    networks:
      - dev

  mongo_seed:
    container_name: mongo_seed
    build: .
    networks:
      - dev
    depends_on:
      - mongo

networks:
  dev:
    name: dev
    driver: bridge

Dockerfile

FROM mongo:latest
COPY elements.json /elements.json
CMD mongoimport --host mongo --db mendeleev --collection elements --drop --file /elements.json --jsonArray

You probably need to rebuild current images.


You can use Mongo Seeding Docker image.

Why?

  • You have the Docker image ready to go
  • You are not tied to JSON files - JavaScript and TypeScript files are supported as well (including optional model validation with TypeScript)

Example usage with Docker 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:3.0.0'
    environment:
    - DROP_DATABASE=true
    - REPLACE_ID=true
    - *dbName
    - *dbPort
    - *dbHost
    volumes:
    - ./data-import/dev/:/data-import/dev/
    working_dir: /data-import/dev/data/
    links:
    - database
    depends_on:
    - database

Disclaimer: I am the author of this library.


It's well worth looking at this answer: https://stackoverflow.com/a/42917632/5209935

The basic idea is that the stock mongo image has a special entrypoint that you can overload to provide a script that seeds the database.


You can use this image that provides docker container for many jobs ( import, export , dump )

Look at the example using docker-compose


To answer my own question:

  • simple YAML file to create simple mongo container linked to a data volume container, fired up by Vagrant docker compose.
  • in the Vagrantfile, code along the lines of:

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

to import the data.

Package the box.

Distribute the box.

For the user, a simple Vagrantfile to load the box and run a simple docker-compose YAML script to start the containers and mount the mongo db against the data volume container.

ReferenceURL : https://stackoverflow.com/questions/31210973/how-do-i-seed-a-mongo-database-using-docker-compose

반응형