如何使用数据库构建基于 mongo 的映像



我想用数据库构建一个基于mongo的镜像,而目前我只能用数据构建镜像,然后在容器中创建数据库,我想知道是否有可能构建当任何人运行时它可以得到一个带有数据库的容器的镜像。

我的码头工人构建/:

./dockerfile
./doc_info_product.json
./word_sim.json
./importjson.sh

importjson.sh

#!/bin/sh^M
mongoimport --db mydb --collection doc_info_product --type json --file /data/db/doc_info_product.json --jsonArray
mongoimport --db mydb --collection word_sim --type json --file /data/db/word_sim.json --jsonArray

码头工人文件:

FROM mongo
RUN mkdir -p /data/db
COPY doc_info_product.json /data/db/doc_info_product.json 
COPY word_sim.json /data/db/word_sim.json
RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db --smallfiles
EXPOSE 27017
VOLUME [ "/data/db" ]
CMD [ "mongod", "--smallfiles"]

构建映像:

docker build --rm -f dockerfile -t mymongo:1.0 .
Sending build context to Docker daemon  13.27MB
Step 1/8 : FROM mongo
 ---> 0f57644645eb
Step 2/8 : RUN mkdir -p /data/db
 ---> Using cache
 ---> 5d5ef408cf76
Step 3/8 : COPY doc_info_product.json /data/db/doc_info_product.json
 ---> Using cache
 ---> 9c79927bf287
Step 4/8 : COPY word_sim.json /data/db/word_sim.json
 ---> Using cache
 ---> 6daeb8789102
Step 5/8 : RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db --smallfiles
 ---> Using cache
 ---> 73ab4b186ef5
Step 6/8 : EXPOSE 27017
 ---> Using cache
 ---> 66787b323bbf
Step 7/8 : VOLUME [ "/data/db" ]
 ---> Using cache
 ---> b8daefe9a984
Step 8/8 : CMD [ "mongod", "--smallfiles"]
 ---> Using cache
 ---> 64de133825db
Successfully built 64de133825db
Successfully tagged mymongo:1.0

运行图像:

docker run mymongo:1.0
[initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=d935783199ad
[initandlisten] db version v3.6.2
[initandlisten] git version: 489d177dbd0f0420a8ca04d39fd78d0a2c539420
[initandlisten] OpenSSL version: OpenSSL 1.0.1t  3 May 2016
[initandlisten] allocator: tcmalloc
[initandlisten] modules: none
[initandlisten] build environment:
[initandlisten]     distmod: debian81
[initandlisten]     distarch: x86_64
[initandlisten]     target_arch: x86_64
[initandlisten] options: { net: { bindIpAll: true }, storage: { mmapv1: { smallFiles: true } } }
[initandlisten]
[initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
[initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
[initandlisten] wiredtiger_open config: create,cache_size=478M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
[initandlisten] Detected configuration for non-active storage engine mmapv1 when current storage engine is wiredTiger
[initandlisten]
[initandlisten] ** WARNING: Access control is not enabled for the database.
[initandlisten] **          Read and write access to data and configuration is unrestricted.
[initandlisten]
[initandlisten] createCollection: admin.system.version with provided UUID: 7b49fe9e-5847-4fe1-9b34-2fca27ab4bab
[initandlisten] setting featureCompatibilityVersion to 3.6
[initandlisten] createCollection: local.startup_log with generated UUID: 8f254aea-76ce-4694-a55a-8e96b269a9be
[initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
[initandlisten] waiting for connections on port 27017

在 contanier 中创建数据库:

docker ps
d935783199ad        mymongo:1.0       ...
docker exec d935783199ad -it bash
root@d935783199ad:/# mongoimport --db mydb --collection doc_info_product --type json --file /data/db/doc_info_product.json --jsonArray
2018-02-02T03:42:29.581+0000    connected to: localhost
2018-02-02T03:42:30.166+0000    imported 1000 documents
root@d935783199ad:/# mongoimport --db mydb --collection word_sim --type json --file /data/db/word_sim.json --jsonArray
2018-02-02T03:42:45.716+0000    connected to: localhost
2018-02-02T03:42:45.787+0000    imported 1000 documents

检查 mydb:

root@d935783199ad:/# mongo
MongoDB shell version v3.6.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
Server has startup warnings:
2018-02-02T03:38:57.027+0000 I STORAGE  [initandlisten]
2018-02-02T03:38:57.027+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-02-02T03:38:57.027+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-02-02T03:38:57.144+0000 I CONTROL  [initandlisten]
2018-02-02T03:38:57.144+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-02-02T03:38:57.144+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-02-02T03:38:57.144+0000 I CONTROL  [initandlisten]
2018-02-02T03:42:50.549+0000 E -        [main] Error loading history file: FileOpenFailed: Unable to fopen() file /root/.dbshell: No such file or directory
> show dbs
admin  0.000GB
local  0.000GB
mydb   0.005GB
> use mydb
switched to db mydb
> show collections
doc_info_product
word_sim

我想通过构建映像来获取mydb.doc_info_productmydb.word_sim,然后运行它,所以我尝试了:

dockerfile更改为

FROM mongo
RUN mkdir -p /data/db
COPY doc_info_product.json /data/db/doc_info_product.json 
COPY word_sim.json /data/db/word_sim.json
RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db --smallfiles
COPY importjson.sh /data/db/importjson.sh
RUN chmod +x /data/db/importjson.sh
ENTRYPOINT ["/data/db/importjson.sh"]
EXPOSE 27017
VOLUME [ "/data/db" ]
CMD [ "mongod", "--smallfiles"]

然后构建:

docker build --rm -f dockerfile -t mymongo:2.0 .
Sending build context to Docker daemon  13.27MB
Step 1/11 : FROM mongo
 ---> 0f57644645eb
Step 2/11 : RUN mkdir -p /data/db
 ---> Using cache
 ---> 5d5ef408cf76
Step 3/11 : COPY doc_info_product.json /data/db/doc_info_product.json
 ---> Using cache
 ---> 9c79927bf287
Step 4/11 : COPY word_sim.json /data/db/word_sim.json
 ---> Using cache
 ---> 6daeb8789102
Step 5/11 : RUN mongod --fork --logpath /var/log/mongodb.log --dbpath /data/db --smallfiles
 ---> Using cache
 ---> 73ab4b186ef5
Step 6/11 : COPY importjson.sh /data/db/importjson.sh
 ---> 072a2de84dd9
Step 7/11 : RUN chmod +x /data/db/importjson.sh
 ---> Running in 4779f52a9a24
Removing intermediate container 4779f52a9a24
 ---> f262f194508a
Step 8/11 : ENTRYPOINT ["/data/db/importjson.sh"]
 ---> Running in 7624286181ac
Removing intermediate container 7624286181ac
 ---> a909f0886298
Step 9/11 : EXPOSE 27017
 ---> Running in ad28534d97fd
Removing intermediate container ad28534d97fd
 ---> 2f49377f40fd
Step 10/11 : VOLUME [ "/data/db" ]
 ---> Running in 429d04e2b24e
Removing intermediate container 429d04e2b24e
 ---> ed081dc3bf4e
Step 11/11 : CMD [ "mongod", "--smallfiles"]
 ---> Running in 1c6f53af7bbd
Removing intermediate container 1c6f53af7bbd
 ---> 6aa20c93a7f4
Successfully built 6aa20c93a7f4
Successfully tagged mymongo:2.0

然后运行:

docker run mymongo:2.0
standard_init_linux.go:195: exec user process caused "no such file or directory"

我的码头工人信息:

Containers: 79
 Running: 5
 Paused: 0
 Stopped: 74
Images: 95
Server Version: 17.12.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host ipvlan macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: active
 NodeID: pb9z7cctp5bx1xzuj125shh69
 Is Manager: true
 ClusterID: qaip1vuuq1bno94xn8tz6ipql
 Managers: 1
 Nodes: 1
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Number of Old Snapshots to Retain: 0
  Heartbeat Tick: 1
  Election Tick: 3
 Dispatcher:
  Heartbeat Period: 5 seconds CA Configuration:
  Expiry Duration: 3 months
  Force Rotate: 0
 Autolock Managers: false
 Root Rotation In Progress: false
 Node Address: 192.168.65.3
 Manager Addresses:
  192.168.65.3:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 89623f28b87a6004d4b785663257362d1658a729
runc version: b2567b37d7b75eb4cf325b77297b140ea686ce8f
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.9.60-linuxkit-aufs
Operating System: Docker for Windows
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.934GiB
Name: linuxkit-00155d327211
ID: S3WK:QDKK:XGGV:VQJY:Z3XC:5YQD:QQSF:3FSM:WJ3Z:34GU:35FZ:DKMH
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 81
 Goroutines: 208
 System Time: 2018-02-02T04:20:08.6685331Z
 EventsListeners: 1
Registry: https://index.docker.io/v1/
Labels:
Experimental: true
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

我不知道是否可以使用数据库构建一个映像,其他人可以使用它,只需拉取并运行映像即可。

多谢。

您的答案看起来像您的 Dockerfile 或 Bash 脚本中存在一些无效路径的问题。也发布您的脚本,以帮助查看实际问题。无论如何,以下是实现所需目标的一般方法:

只需将 bash 脚本添加到 Dockerfile 即可完成您的工作。然后,您可以创建一个数据库,也可以使用 bash 脚本向其添加数据。

下面是创建用户和数据库的示例代码:

mongo admin << EOF
use admin;
db.createUser({
    user: 'useradmin',
    pwd: '${PASS}',
    roles:[{
        role:'userAdminAnyDatabase',
        db:'admin'
    }]
});
exit
EOF
mongo admin -u useradmin -p ${PASS} << EOF
use DbName;
db.createUser({
    user: ${USER},
    pwd: ${PASS},
    roles:[{
        role:'readWrite',
        db:${DATABASE}
    }]
});
exit
EOF

下面是添加数据的示例代码:

mongo -u yourUser -p yourPass DbName << EOF
 ...Your_MongoDB_Commands_Here
EOF

如果这还不够清楚,我做了一些类似于我的一个旧项目的事情(脚本基于我不记得的另一个来源,但无论如何都应该有所帮助(。以下是相关文件的链接:Github。

最新更新