簡體   English   中英

如何使用 docker-compose 為 mongo 數據庫做種?

[英]How do I seed a mongo database using docker-compose?

我正在嘗試分發一組在多個鏈接容器中運行的連接應用程序,其中包括需要的 mongo 數據庫:

  • 分發包含一些種子數據;
  • 允許用戶添加額外的數據。

理想情況下,數據也將保存在鏈接的數據卷容器中。

我可以使用不掛載任何卷的mongo基礎實例(dockerhub 圖像: psychemedia/mongo_nomount - 這本質上是沒有VOLUME /data/db語句的基礎 mongo Dockerfile)和一個Dockerfile配置將數據放入mongo容器中的行:

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./testdata.csv位於同一目錄 ( ./mongo-with-data ) 中。

我的 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 / Vagrantfile -compose YAML 文件,該文件將啟動一組鏈接的應用程序,其中包括一個預先播種的mongo數據庫,其中包含(部分預-populated) 持久數據容器。

我使用另一個 docker 容器執行此操作,其唯一目的是播種 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 / Dockerfile docker-compose.yml提到的每個文件位置,都是相對於docker-compose.yml位置

文件

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}}

種子.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-script的字母順序createUser等...

有關如何自定義 MongoDB Docker 服務的更多詳細信息,請閱讀此內容

此外,最好將您的密碼和用戶名從 Public 中保密,不要在 public git 上推送憑據,而是使用Docker Secrets 另請閱讀此秘密教程

請注意,沒有必要進入docker-swarm 模式來使用秘密。 Compose Files 也支持秘密。 檢查這個

Secrets 也可以用在MongoDB Docker 服務中

當前答案基於 @Jeff Fairley答案並根據新的 Docker 文檔進行更新

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

您可能需要重建當前圖像。

以下是我們如何使用一次性容器清理和播種圖像的文章https://blog.ardoq.com/dynamic-database-seeding-with-docker

您可以使用此映像為許多作業(導入、導出、轉儲)提供 docker 容器

查看使用 docker-compose 的示例

您可以使用Mongo Seeding Docker 鏡像

為什么?

  • 你已經准備好了 Docker 鏡像
  • 您不受 JSON 文件的束縛 - 也支持 JavaScript 和 TypeScript 文件(包括使用 TypeScript 的可選模型驗證)

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

免責聲明:我是這個庫的作者。

非常值得看看這個答案: https//stackoverflow.com/a/42917632/5209935

基本的想法是stock mongo圖像有一個特殊的入口點,你可以重載它以提供一個種子數據庫的腳本。

回答我自己的問題:

  • 簡單的 YAML 文件,用於創建鏈接到數據卷容器的簡單 mongo 容器,由 Vagrant docker compose 啟動。
  • 在 Vagrantfile 中,代碼如下:

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

導入數據。

包裝盒子。

分發盒子。

對於用戶來說,一個簡單的 Vagrantfile 來加載盒子並運行一個簡單的 docker-compose YAML 腳本來啟動容器並將 mongo db 安裝到數據卷容器上。

這是工作數據庫種子 mongodb docker compose 使用以下命令為數據庫 Dockerfile 提供種子

FROM mongo:3.6.21

COPY init.json /init.json

CMD mongoimport --uri mongodb://mongodb:27017/testdb --collection users --type json --file /init.json --jsonArray

docker-compose.yml

 version: "3.7"
 services:  
    mongodb:
        container_name: mongodb
        image: mongo:3.6.21
        environment: 
          - MONGO_INITDB_DATABASE=testdb
        volumes:
          - ./data:/data/db
        ports:
          - "27017:27017"
    
      mongo_seed:
        build: ./db
        depends_on:
          - mongodb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM