![](/img/trans.png)
[英]How do I connect my mongo database to my node app with this mongoDB connection string using docker-compose?
[英]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
您可以使用Mongo Seeding Docker 鏡像。
為什么?
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圖像有一個特殊的入口點,你可以重載它以提供一個種子數據庫的腳本。
回答我自己的問題:
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.