正在尝试使用MongoDB数据库创建Docker映像,但即使已成功加载,容器也没有该映像
数据库中的数据将由另一个容器中的API显示。以前,我使用在运行期间成功加载了数据库。但是,我的数据库相当大(10gb),理想情况下,我不必在每次启动新容器时再次加载数据库。我希望在构建时加载数据库。为了实现这一点,我为Dockerfile尝试了以下方法:正在尝试使用MongoDB数据库创建Docker映像,但即使已成功加载,容器也没有该映像,mongodb,docker,Mongodb,Docker,数据库中的数据将由另一个容器中的API显示。以前,我使用在运行期间成功加载了数据库。但是,我的数据库相当大(10gb),理想情况下,我不必在每次启动新容器时再次加载数据库。我希望在构建时加载数据库。为了实现这一点,我为Dockerfile尝试了以下方法: FROM mongo:4.0.6-xenial COPY dump /data/dump RUN mongod --fork --logpath /var/log/mongod.log \ && mongorestore /
FROM mongo:4.0.6-xenial
COPY dump /data/dump
RUN mongod --fork --logpath /var/log/mongod.log \
&& mongorestore /data/dump \
&& mongo --eval "db.getSiblingDB('db').createUser({user:'user',pwd:'pwd',roles:['readWrite']})" \
&& mongod --shutdown
当我运行此映像时,我希望数据库位于容器中,但事实并非如此,用户也不存在。但是,日志文件/var/log/mongod.log表明,据我所知,数据库加载成功。为什么这不起作用?将数据库数据写入一个文件中
在运行时(因此在docker容器中),请记住,写入卷的文件最终不会写入容器文件系统。这样做是为了持久化您的数据,使其在容器删除后仍然存在,但更重要的是,出于性能原因,在数据库上下文中。要使磁盘具有良好的I/O性能,磁盘操作必须在卷上完成,而不是在容器文件系统本身上
在构建时(因此,在创建docker映像时),如果您碰巧在Dockerfile中运行了运行/添加/复制指令,并将文件写入已声明为卷的位置,则这些文件将被丢弃。但是,如果您将文件写入docker文件中的某个目录,并且仅在将该目录声明为卷之后,该卷才会保留这些文件,除非您启动容器并使用docker run-v
选项指定卷
这意味着,如果您自己的Dockerfile是从mongo
构建的,/data
位置已声明为卷。将文件写入该位置是毫无意义的
可以做些什么?
从头开始打造自己的mongo形象
知道卷是如何工作的,您可以从官方mongo Docker映像的Docker文件中复制内容,并插入RUN
/ADD
/copy
指令,以便在VOLUME/data/db/data/configdb
指令之前将文件写入/db
位置
覆盖入口点
假设您有一个名为mongo data db.tar
的tar归档文件,其中包含来自包含所有数据库和所需集合的mongo容器的/data/db
位置的内容,您可以使用以下Dockerfile和copy-initial-data-entry-point.sh,您可以构建一个映像,该映像将在每次启动容器时将这些数据复制到/data/db
位置。这仅在这样一个用例中才有意义,即这样一个容器用于测试套件,该测试套件每次启动时都需要相同的初始数据,因为在每次启动时之前的数据都被初始数据替换
Dockerfile:
FROM mongo
COPY ./mongo-data-db.tar /mongo-data-db.tar
COPY ./copy-initial-data-entry-point.sh /
RUN chmod +x /copy-initial-data-entry-point.sh
ENTRYPOINT [ "/copy-initial-data-entry-point.sh"]
CMD ["mongod"]
复制初始数据输入点。sh:
FROM mongo
COPY ./mongo-data-db.tar /mongo-data-db.tar
COPY ./copy-initial-data-entry-point.sh /
RUN chmod +x /copy-initial-data-entry-point.sh
ENTRYPOINT [ "/copy-initial-data-entry-point.sh"]
CMD ["mongod"]
#/bin/bash
set-e
tarxf/mongo-data-db.tar-C/
exec/usr/local/bin/docker-entrypoint.sh“$@”
要从名为my mongo container
的mongo容器的卷中提取/data/db
的内容,请执行以下操作:
- 停止mongo容器:
docker停止我的mongo容器
- 创建一个临时容器以从以下卷生成tar存档:
docker run--rm--mymongo容器中的卷-v$(pwd):/out ubuntu tar cvf/out/mongo data db.tar
请注意,此存档将相当大,因为它包含mongo服务器数据的全部内容,包括索引,如的可能副本中所述