Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在尝试使用MongoDB数据库创建Docker映像,但即使已成功加载,容器也没有该映像_Mongodb_Docker - Fatal编程技术网

正在尝试使用MongoDB数据库创建Docker映像,但即使已成功加载,容器也没有该映像

正在尝试使用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 /

数据库中的数据将由另一个容器中的API显示。以前,我使用在运行期间成功加载了数据库。但是,我的数据库相当大(10gb),理想情况下,我不必在每次启动新容器时再次加载数据库。我希望在构建时加载数据库。为了实现这一点,我为Dockerfile尝试了以下方法:

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服务器数据的全部内容,包括索引,如

的可能副本中所述