我正在尝试分发一组在多个链接容器中运行的连接应用程序,其中包括一个 mongo 数据库,该数据库需要:
- 分发包含一些种子数据;
- 允许用户添加额外的数据。
理想情况下,数据也将保存在链接的数据卷容器中。
我可以使用 mongo
不安装任何卷的基本实例将数据放入 mongo
容器中(dockerhub 图像: psychemedia/mongo_nomount
- 这基本上是基础mongo Dockerfile 没有 VOLUME /data/db
语句)和 Dockerfile
配置如下:
ADD . /files
WORKDIR /files
RUN mkdir -p /data/db && mongod --fork --logpath=/tmp/mongodb.log && sleep 20 && \
mongoimport --db testdb --collection testcoll --type csv --headerline --file ./testdata.csv #&& mongod --shutdown
其中 ./testdata.csv
与 Dockerfile 在同一目录( ./mongo-with-data
)中。
我的 docker-compose 配置文件包括以下内容:
mongo:
#image: mongo
build: ./mongo-with-data
ports:
- "27017:27017"
#Ideally we should be able to mount this against a host directory
#volumes:
# - ./db/mongo/:/data/db
#volumes_from:
# - devmongodata
#devmongodata:
# command: echo created
# image: busybox
# volumes:
# - /data/db
每当我尝试安装 VOLUME 时,似乎原始种子数据(存储在 /data/db
中)被删除了。我想当一个卷安装到 /data/db
时,它会替换当前的任何内容。
也就是说, docker 用户指南建议: _在创建容器时初始化卷。如果容器的基础镜像包含指定挂载点的数据,那么现有数据会在卷初始化时复制到新卷中_?因此,如果我在播种 RUN
命令之后放置 VOLUME 命令,我希望数据会持续存在?
那么我做错了什么?
从长远来看,我想自动构建几个链接容器,然后分发一个 Vagrantfile
/docker-compose YAML 文件,该文件将启动一组链接的应用程序,其中包括一个预先播种的 mongo
具有(部分预填充)持久数据容器的数据库。
原文由 psychemedia 发布,翻译遵循 CC BY-SA 4.0 许可协议
我使用另一个 docker 容器来执行此操作,其唯一目的是播种 mongo,然后退出。我怀疑这与 ebaxt 的想法相同,但是当我在寻找这个问题的答案时,我只是想看一个简单而直接的例子。所以这是我的:
码头工人-compose.yml
mongo-seed/Dockerfile
mongo-seed/init.json