docker-compose를 사용하여 mongo 데이터베이스를 어떻게 시드합니까?
다음을 수행하는 데 필요한 mongo 데이터베이스를 포함하는 여러 연결된 컨테이너에서 실행되는 연결된 응용 프로그램 집합을 배포하려고합니다.
- 일부 시드 데이터를 포함하는 배포
- 사용자가 추가 데이터를 추가 할 수 있습니다.
이상적으로 데이터는 연결된 데이터 볼륨 컨테이너에도 유지됩니다.
볼륨을 마운트하지 않는 기본 인스턴스 (dockerhub 이미지 : -이것은 본질적으로 문이 없는 기본 mongo Dockerfile 임 )와 다음과 같은 구성을 mongo
사용 하여 컨테이너에 데이터를 가져올 수 있습니다 .mongo
psychemedia/mongo_nomount
VOLUME /data/db
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
같은 디렉토리 (에 ./mongo-with-data
Dockerfile 등).
내 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
'UFO ET IT' 카테고리의 다른 글
C ++ 14에서 람다를 통해 std :: bind를 사용하는 이유는 무엇입니까? (0) | 2020.12.30 |
---|---|
사용자가 iOS에서 이미 카메라 액세스를 거부 한 후 사용자에게 카메라 액세스를 요청하는 방법이 있습니까? (0) | 2020.12.30 |
키보드 위에 Android SnackBar를 표시 하시겠습니까? (0) | 2020.12.30 |
Scheme 또는 일반적으로 사용되는 'thunk'는 무엇입니까? (0) | 2020.12.29 |
Enter 키로 양식 제출 방지 (0) | 2020.12.29 |