[MONGODB] 어떻게 기본 컬렉션과 데이터가있는 몽고 도커 이미지를 만드는 방법?
MONGODB어떻게 기본 컬렉션과 데이터가있는 몽고 도커 이미지를 만드는 방법?
난 내 자신의 몽고 고정 표시기 이미지를 구축하려면 여기를 지원할 필요가있다.
내가 만들고 기본 컬렉션과 데이터로 고정 표시기 이미지를 전달하기 위해 내 Dockerfile에서 호출되어야한다 MongoDB를에 데이터를 삽입하는 스크립트의 목록을 가지고있다.
여기 내 Dockerfile 현재와 같은 모습입니다 :
FROM mongo:latest
RUN mkdir -p /data/scripts
COPY . /data/scripts
RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db/
RUN FILES=scripts/*-create.js
RUN for f in $FILES; do mongo mydb $f; done
RUN FILES=scripts/*-insert.js
RUN for f in $FILES; do mongo mydb $f; done
RUN mongod --shutdown
나는 시작과 정지 mongod 항상 둘 중 하나가 현재 스크립트 인상을, 다음과 같은 오류가 실패 할 다른 옵션을 시도했다 :
There doesn't seem to be a server running with dbpath: /data/db
최신 정보
@ 매트의 대답 후 나는 성공적 명령 체인을 실행할 수 있습니다,하지만 여전히 (내-DB)는 내 데이터베이스가, 컬렉션과 데이터를 볼 수 없습니다.
현재 Dockerfile :
FROM mongo:latest
RUN mkdir -p /data/db/scripts
COPY . /data/db
RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db \
&& CREATE_FILES=/data/db/scripts/*-create.js \
&& for f in $CREATE_FILES; do mongo 127.0.0.1:27017 $f; done \
&& INSERT_FILES=/data/db/scripts/*-insert.js \
&& for f in $INSERT_FILES; do mongo 127.0.0.1:27017 $f; done \
&& mongod --shutdown
고정 표시기 빌드 명령의 출력 :
Sending build context to Docker daemon 10.24 kB
Step 1 : FROM mongo:latest
---> c08c92f4cb13
Step 2 : RUN mkdir -p /data/db/scripts
---> Running in a7088943bb57
---> 373c7319927d
Removing intermediate container a7088943bb57
Step 3 : COPY . /data/db
---> 8fa84884edb7
Removing intermediate container ae43e2c24fee
Step 4 : RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db && CREATE_FILES=/data/db/scripts/*-create.js && for f in $CREATE_FILES; do mongo 127.0.0.1:27017 $f; done && INSERT_FILES=/data/db/scripts/*-insert.js && for f in $INSERT_FILES; do mongo 127.0.0.1:27017 $f; done && mongod --shutdown
---> Running in 33970b6865ee
about to fork child process, waiting until server is ready for connections.
forked process: 10
child process started successfully, parent exiting
MongoDB shell version: 3.0.7
connecting to: 127.0.0.1:27017/test
MongoDB shell version: 3.0.7
connecting to: 127.0.0.1:27017/test
killing process with pid: 10
---> 8451e43b7749
Removing intermediate container 33970b6865ee
Successfully built 8451e43b7749
내가 말했듯이, 나는 여전히 몽고 쉘을 사용하여 내 데이터베이스에 데이터베이스, 컬렉션과 데이터를 볼 수 없습니다. 또한 나는 실행중인 컨테이너에 연결되어 mongodb.log를 가지고 :
2015-11-06T16:15:14.562+0000 I JOURNAL [initandlisten] journal dir=/data/db/journal
2015-11-06T16:15:14.562+0000 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed
2015-11-06T16:15:14.698+0000 I JOURNAL [initandlisten] preallocateIsFaster=true 2.36
2015-11-06T16:15:14.746+0000 I JOURNAL [durability] Durability thread started
2015-11-06T16:15:14.746+0000 I JOURNAL [journal writer] Journal writer thread started
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] MongoDB starting : pid=10 port=27017 dbpath=/data/db 64-bit host=9c05d483673a
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten]
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten]
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten]
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten]
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] db version v3.0.7
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] git version: 6ce7cbe8c6b899552dadd907604559806aa2e9bd
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] build info: Linux ip-10-183-78-195 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 BOOST_LIB_VERSION=1_49
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] allocator: tcmalloc
2015-11-06T16:15:14.747+0000 I CONTROL [initandlisten] options: { processManagement: { fork: true }, storage: { dbPath: "/data/db" }, systemLog: { destination: "file", path: "/var/log/mongodb.log" } }
2015-11-06T16:15:14.748+0000 I INDEX [initandlisten] allocating new ns file /data/db/local.ns, filling with zeroes...
2015-11-06T16:15:14.802+0000 I STORAGE [FileAllocator] allocating new datafile /data/db/local.0, filling with zeroes...
2015-11-06T16:15:14.802+0000 I STORAGE [FileAllocator] creating directory /data/db/_tmp
2015-11-06T16:15:14.804+0000 I STORAGE [FileAllocator] done allocating datafile /data/db/local.0, size: 64MB, took 0 secs
2015-11-06T16:15:14.807+0000 I NETWORK [initandlisten] waiting for connections on port 27017
2015-11-06T16:15:14.830+0000 I NETWORK [initandlisten] connection accepted from 127.0.0.1:49641 #1 (1 connection now open)
2015-11-06T16:15:14.832+0000 I INDEX [conn1] allocating new ns file /data/db/my-db.ns, filling with zeroes...
2015-11-06T16:15:14.897+0000 I STORAGE [FileAllocator] allocating new datafile /data/db/my-db.0, filling with zeroes...
2015-11-06T16:15:14.898+0000 I STORAGE [FileAllocator] done allocating datafile /data/db/my-db.0, size: 64MB, took 0 secs
2015-11-06T16:15:14.904+0000 I NETWORK [conn1] end connection 127.0.0.1:49641 (0 connections now open)
2015-11-06T16:15:14.945+0000 I NETWORK [initandlisten] connection accepted from 127.0.0.1:49642 #2 (1 connection now open)
2015-11-06T16:15:14.958+0000 I NETWORK [conn2] end connection 127.0.0.1:49642 (0 connections now open)
2015-11-06T16:15:14.982+0000 I CONTROL [signalProcessingThread] got signal 15 (Terminated), will terminate after current cmd ends
2015-11-06T16:15:14.982+0000 I CONTROL [signalProcessingThread] now exiting
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] shutdown: going to close listening sockets...
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] closing listening socket: 6
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] closing listening socket: 7
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] removing socket file: /tmp/mongodb-27017.sock
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] shutdown: going to flush diaglog...
2015-11-06T16:15:14.982+0000 I NETWORK [signalProcessingThread] shutdown: going to close sockets...
2015-11-06T16:15:14.982+0000 I STORAGE [signalProcessingThread] shutdown: waiting for fs preallocator...
2015-11-06T16:15:14.982+0000 I STORAGE [signalProcessingThread] shutdown: final commit...
2015-11-06T16:15:15.008+0000 I JOURNAL [signalProcessingThread] journalCleanup...
2015-11-06T16:15:15.008+0000 I JOURNAL [signalProcessingThread] removeJournalFiles
2015-11-06T16:15:15.009+0000 I JOURNAL [signalProcessingThread] Terminating durability thread ...
2015-11-06T16:15:15.088+0000 I JOURNAL [journal writer] Journal writer thread stopped
2015-11-06T16:15:15.088+0000 I JOURNAL [durability] Durability thread stopped
2015-11-06T16:15:15.088+0000 I STORAGE [signalProcessingThread] shutdown: closing all files...
2015-11-06T16:15:15.090+0000 I STORAGE [signalProcessingThread] closeAllFiles() finished
2015-11-06T16:15:15.090+0000 I STORAGE [signalProcessingThread] shutdown: removing fs lock...
2015-11-06T16:15:15.090+0000 I CONTROL [signalProcessingThread] dbexit: rc: 0
또한 폴더 / 데이터 / DB 내용을 확인 :
root@fbaf17233182:/data/db# ls -al
total 16
drwxr-xr-x 3 mongodb mongodb 4096 Nov 6 16:15 .
drwxr-xr-x 4 root root 4096 Nov 6 16:15 ..
drwxr-xr-x 2 root root 4096 Nov 5 18:55 scripts
도움이 될 수 있습니다 :
해결법
-
==============================
1.문제는 내가 내 자신의 데이터 디렉토리를 생성하는 솔루션을 만들었습니다 그래서 정보 / DB / 데이터에 저장할 수 없습니다이었다.
문제는 내가 내 자신의 데이터 디렉토리를 생성하는 솔루션을 만들었습니다 그래서 정보 / DB / 데이터에 저장할 수 없습니다이었다.
# Parent Dockerfile https://github.com/docker-library/mongo/blob/982328582c74dd2f0a9c8c77b84006f291f974c3/3.0/Dockerfile FROM mongo:latest # Modify child mongo to use /data/db2 as dbpath (because /data/db wont persist the build) RUN mkdir -p /data/db2 \ && echo "dbpath = /data/db2" > /etc/mongodb.conf \ && chown -R mongodb:mongodb /data/db2 COPY . /data/db2 RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db2 --smallfiles \ && CREATE_FILES=/data/db2/scripts/*-create.js \ && for f in $CREATE_FILES; do mongo 127.0.0.1:27017 $f; done \ && INSERT_FILES=/data/db2/scripts/*-insert.js \ && for f in $INSERT_FILES; do mongo 127.0.0.1:27017 $f; done \ && mongod --dbpath /data/db2 --shutdown \ && chown -R mongodb /data/db2 # Make the new dir a VOLUME to persists it VOLUME /data/db2 CMD ["mongod", "--config", "/etc/mongodb.conf", "--smallfiles"]
고정 표시기 라이브러리에서 @yosifkit 덕분에 / 볼륨이 결과 이미지에 데이터를 저장한다고 지적에 대한 Github에서 프로젝트를 몽고. 나는 문서에 그것을 놓쳤다.
-
==============================
2.고정 표시기 이미지를 빌드하는 동안 RUN 같은 각 빌드 명령은 자신의 고정 표시기 컨테이너에서 시작되고 명령이 완료 한 후 때 데이터가 이미지로 최선을 다하고 있습니다. 이미지가 --tree dockviz 빌드를 수행하는 동안 실행하면 당신은 아이디어를 얻을 것이다.
고정 표시기 이미지를 빌드하는 동안 RUN 같은 각 빌드 명령은 자신의 고정 표시기 컨테이너에서 시작되고 명령이 완료 한 후 때 데이터가 이미지로 최선을 다하고 있습니다. 이미지가 --tree dockviz 빌드를 수행하는 동안 실행하면 당신은 아이디어를 얻을 것이다.
귀하의 경우에는 mongod 시작하고 당신이 그것을 필요로 오래 전에 중지되었습니다. 당신은 몽고를 시작하고 스크립트에게 한 RUN 단계에서 모두를 실행해야합니다. 당신은 출시가 mongod하고 데이터를 삽입하는 쉘 스크립트를 사용하여 해당를 얻을 수 있습니다.
귀하의 Dockerfile가 실행됩니다 :
RUN mongo_create_insert.sh
그런 다음 mongo_create_insert.sh 모든 몽고 따라 단계가 포함되어 있습니다 :
#!/usr/bin/env bash mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db/ FILES=scripts/*-create.js for f in $FILES; do mongo mydb $f; done FILES=scripts/*-insert.js for f in $FILES; do mongo mydb $f; done mongod --shutdown
보조 노트로서, 나는 내 기본 이미지 및 사용 Ansible를 설치하는 경향이 단일 RUN 명령에서 제공 도커 이미지에 오히려 (결국 단지 영광 쉘 스크립트)를 Dockerfile에서 쉘 RUN 단계를 많이하는 것보다. 당신은 빌드 캐싱 쾌적의 일부를 잃고 그러나 우리는 이유 쉘 스크립트를 프로비저닝에서에 이동했습니다.
-
==============================
3.DockerHub의 이미지의 설명에 따르면,이에 대한 더 깨끗하고 간단한 해결책이있다.
DockerHub의 이미지의 설명에 따르면,이에 대한 더 깨끗하고 간단한 해결책이있다.
첫째, Dockerfile는 간단하다
FROM mongo:4 COPY setup.sh /docker-entrypoint-initdb.d/ COPY scripts /
그런 다음, setup.sh, 예를 들어, 사용자 / 수집 생성 스크립트를 추가
mongo=( mongo --host 127.0.0.1 --port 27017 --quiet ) mongo+=( --username="$MONGO_INITDB_ROOT_USERNAME" --password="$MONGO_INITDB_ROOT_PASSWORD" --authenticationDatabase="$rootAuthDatabase" ) CREATE_FILES=/scripts/*-create.js for f in $CREATE_FILES; do "${mongo[@]}" "$MONGO_INITDB_DATABASE" $f; done INSERT_FILES=/scripts/*-insert.js for f in $INSERT_FILES; do "${mongo[@]}" "$MONGO_INITDB_DATABASE" $f; done
from https://stackoverflow.com/questions/33558506/how-to-create-a-mongo-docker-image-with-default-collections-and-data by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의 컬렉션 중복 문서의 삽입을 중지하는 방법 (0) | 2019.12.14 |
---|---|
[MONGODB] MongoDB의에서 가장 큰 문서 크기를 찾기 (0) | 2019.12.14 |
[MONGODB] 오류 : GET 호출에 대한 nodejs에서한다 getaddrinfo의 ENOTFOUND (0) | 2019.12.14 |
[MONGODB] 방법 MongoDB를 사용하는 캐싱을 해제? (0) | 2019.12.14 |
[MONGODB] MongoDB를 BsonDocument로 변환 문자열 (0) | 2019.12.14 |