복붙노트

[MONGODB] 어떻게 고정 표시기-작성을 사용하여 몽고 데이터베이스를 씨앗합니까?

MONGODB

어떻게 고정 표시기-작성을 사용하여 몽고 데이터베이스를 씨앗합니까?

나는에 요구되는 몽고 데이터베이스를 포함하는 여러 연결 컨테이너에서 실행되는 연결된 응용 프로그램 세트를 배포하는 것을 시도하고있다 :

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

나는 어떤 볼륨을 마운트하지 않는 몽고의 기본 인스턴스를 사용하여 몽고 컨테이너에 데이터를 얻을 수 있습니다 (dockerhub 이미지 : psychemedia / mongo_nomount -이 본질적으로 기초가 VOLUME / 데이터 / DB 문없이 Dockerfile을 몽고)과 Dockerfile의 설정에 따라 라인의 :

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는 Dockerfile과 같은 디렉토리 (./mongo-with-data)에서이다.

내 고정 표시기-작성 설정 파일은 다음을 포함한다 :

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

/ 데이터 저장 / DB - - 삭제 나는 볼륨을 탑재하려고 할 때마다 원래의 시드 데이터는 것처럼 보인다. 나는 볼륨 / 데이터에 장착 될 때이 대체 DB를 / 현재 어떤이 있다고 생각한다.

즉, 고정 표시기의 사용 설명서가 제안했다 : 컨테이너가 생성 될 때 볼륨이 초기화됩니다. 컨테이너의 기본 이미지는 데이터를 포함하는 경우 기존 데이터 볼륨 초기화시 새 볼륨에 복사되어, 마운트 지점을 지정? 나는 시드 RUN 명령 후 VOLUME 명령을 배치하면 지속 할 데이터를 예상 그래서?

그래서 내가 잘못 뭐하는 거지?

긴보기 내가 부분적으로 사전 (여러 링크 용기의 빌드를 자동화하고, 다음과 사전 시드 몽고 데이터베이스를 포함 연결된 앱의 세트를, 불 것 Vagrantfile / 고정 표시기-작성 YAML 파일을 배포 할 것입니다 -populated) 영구 데이터 컨테이너.

해결법

  1. ==============================

    1.나는이 다음 종료, 그의 유일한 목적 종자 몽고에 또 다른 고정 표시기 컨테이너를 사용하여이 작업을 수행. 나는이 ebaxt의 같은 생각입니다 생각,하지만이에 대한 답을 찾고 때, 나는 그냥 빨리 앤 더러운, 아직 간단한 예를보고 싶었다. 그래서 여기 내입니다 :

    나는이 다음 종료, 그의 유일한 목적 종자 몽고에 또 다른 고정 표시기 컨테이너를 사용하여이 작업을 수행. 나는이 ebaxt의 같은 생각입니다 생각,하지만이에 대한 답을 찾고 때, 나는 그냥 빨리 앤 더러운, 아직 간단한 예를보고 싶었다. 그래서 여기 내입니다 :

    도커-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
    

    몽고 씨앗 / Dockerfile

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

    몽고 씨앗 / init.json

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

    2.내가 대신 시드에 다른 컨테이너를 만드는, 도커 사용자 정의 이미지 사용하여 볼륨을 사용하는 것이 유용하다고.

    내가 대신 시드에 다른 컨테이너를 만드는, 도커 사용자 정의 이미지 사용하여 볼륨을 사용하는 것이 유용하다고.

    파일 구조

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

    DOCKERFILE

    FROM mongo:3.6
    
    COPY ./init-db.d/seed.js /docker-entrypoint-initdb.d
    

    도커-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
      }
    ])
    

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

    또한, 대신 도커 비밀을 사용하여 사용자 이름과 패스워드는 공공에서 확보 공공 자식에 자격 증명을 밀어하지 마십시오 유지하는 것이 좋다. 또한 비밀에이 튜토리얼 읽기

    비밀은 MongoDB를 도커 서비스에서 사용할 수 있습니다

  3. ==============================

    3.여기에 우리가 https://blog.ardoq.com/dynamic-database-seeding-with-docker을 청소하고 종자 이미지에 일회용 용기를 사용하는 방법의 작성자입니다

    여기에 우리가 https://blog.ardoq.com/dynamic-database-seeding-with-docker을 청소하고 종자 이미지에 일회용 용기를 사용하는 방법의 작성자입니다

  4. ==============================

    4.현재 답 새 부두 노동자의 문서에 따라 @Jeff Fairley의 답변에 따라 업데이트

    현재 답 새 부두 노동자의 문서에 따라 @Jeff Fairley의 답변에 따라 업데이트

    도커-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
    

    당신은 아마 현재의 이미지를 다시 작성해야합니다.

  5. ==============================

    5.당신은 몽고 시드 도커 이미지를 사용할 수 있습니다.

    당신은 몽고 시드 도커 이미지를 사용할 수 있습니다.

    왜?

    도커 작성과 사용 예제 :

    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
    

    면책 조항 :이 라이브러리의 저자입니다.

  6. ==============================

    6.이 답변을보고 그것의 잘 가치 : https://stackoverflow.com/a/42917632/5209935

    이 답변을보고 그것의 잘 가치 : https://stackoverflow.com/a/42917632/5209935

    기본적인 아이디어는 주식 몽고 이미지가 스크립트 씨앗이 데이터베이스를 제공하기 위해 오버로드 할 수있는 특별한 엔트리 포인트를 가지고 있다는 것입니다.

  7. ==============================

    7.당신은 많은 작업 (가져 오기, 내보내기, 덤프)에 대한 고정 표시기 컨테이너를 제공하는이 이미지를 사용할 수 있습니다

    당신은 많은 작업 (가져 오기, 내보내기, 덤프)에 대한 고정 표시기 컨테이너를 제공하는이 이미지를 사용할 수 있습니다

    고정 표시기-작성을 사용하여 예를 들어 봐

  8. ==============================

    8.내 자신의 질문에 대답하려면 :

    내 자신의 질문에 대답하려면 :

    config.vm.provision : 쉘 인라인 => << - SH      고정 표시기 간부 - 그것은 -d vagrant_mongo_1 mongoimport --db A5 --collection 도로 --type CSV --headerline --file /files/AADF-data-minor-roads.csv SH

    데이터를 가져옵니다.

    상자를 포장합니다.

    상자를 배포합니다.

    사용자에 대한 간단한 Vagrantfile 박스를로드하고 컨테이너를 시작하는 간단한 고정 표시기-작성 YAML 스크립트를 실행하고 데이터 볼륨 컨테이너에 대해 몽고 DB를 마운트합니다.

  9. from https://stackoverflow.com/questions/31210973/how-do-i-seed-a-mongo-database-using-docker-compose by cc-by-sa and MIT license