2015-11-06 7 views
21

私自身のmongoドッカー画像を構築するには、ここでサポートが必要です。デフォルトのコレクションとデータでMongo Dockerイメージを作成するには?

MongoDBにデータを作成して挿入するためのスクリプトのリストがあります。これはDockerファイルで呼び出され、デフォルトのコレクションとデータを持つドッカー画像を提供します。ここで

が現在のように私のDockerfileがどのように見えるかです:私は常に2つの失敗の一つのmongodを起動および停止するためにさまざまなオプションを試してきました

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 

、現在のスクリプトを上げ、次のエラー:

There doesn't seem to be a server running with dbpath: /data/db 

更新

@Matt答えた後、私は正常にコマンドチェインを実行することができ、まだだことはできませんee my database(my-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 

しかし、私が言ったように、私はまだ私のデータベース内のデータベース、コレクションやデータを見ることができませんmongoシェルを使用します。 また、私は実行中のコンテナに接続し、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の内容を確認:

[email protected]:/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 

は助けるかもしれない:

答えて

23

問題は、/db/dataに情報を保存できなかったため、私自身のデータディレクトリを作成するソリューションを作成しました。

# 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"] 

おかげで体積が得られる画像データを記憶するであろうことを指し示すためdocker-library/mongoのGitHubプロジェクトから@yosifkitします。私はドキュメンテーションでそれを逃した。

+1

私はこれを自分自身で理解しようとしてきました。なぜデータが持続しないのですか? – Sergio

+2

@Sergioデータは、VOLUMEが作成された後に追加され、コンテナがイメージに基づいて作成されるまでその状態にとどまるため、VOLUMEには保持されません。ボリューム作成前にディレクトリにデータを追加すると、そのデータは永続化されます。 –

+1

これは本当に不可欠でした。データを変更した後、VOLUMEを指定してください。 RUN mkdir -p/data/db ADD seedMongoDB.js。 RUN $ MONGOD_START && mongo tembowms-dev --quiet seedMongoDB.js && mongod --shutdown VOLUME/data/db – swateek

8

ドッカーイメージのビルド中に、RUNのような各ビルドコマンドが独自のドッカーコンテナで起動され、コマンドが完了するとデータがイメージとしてコミットされます。ビルド中にdockviz images --treeを実行すると、そのアイデアが得られます。

あなたのケースでは、mongodは必要なときにずっと開始して停止しています。 mongoを起動してスクリプトをすべてRUNのステップで実行する必要があります。 mongodを起動してデータを挿入するシェルスクリプトを使用することで、これを達成できます。

あなたDockerfileが実行されます。そして、

RUN mongo_create_insert.sh 

mongo_create_insert.shはすべてあなたのmongo依存の手順が含まれます。注意点として

#!/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コマンドでDockerイメージをプロビジョニングすることは、Dockerfile(これはほんの華麗なシェルスクリプトの最後です)でたくさんのシェル実行ステップを実行するのではなく、あなたはビルドのキャッシュニッチネスのいくつかを失いますが、私たちは理由のためにシェルスクリプトによるプロビジョニングから進んできました。

+0

ありがとう@Matt、これは非常にうれしい説明だったので、スクリプトを実行できるようになりました。それは正常に実行されますが、私はまだ実行中のコンテナで作成されたdbを見ることができません。実行中のコンテナで同じコマンドを実行すると、dbとコレクションが期待どおりに作成されますが、既定のデータベース、コレクションおよびデータを持つドッカーイメージを作成することはできません。私は新しい詳細で答えを更新します。 –

+0

このスクリプトもmongodbが起動するのを待つべきではありませんか? – matanster

+0

'mongod'は接続を受け入れる準備が整うまでフォークしません。 – Matt

関連する問題