当前位置: 首页 > 面试题库 >

如何使用docker-compose播种mongo数据库?

曹和正
2023-03-14
问题内容

我正在尝试分发在几个链接的容器中运行的一组连接的应用程序,这些容器包括一个mongo数据库,该数据库需要:

  • 分发包含一些种子数据;
  • 允许用户添加其他数据。

理想情况下,数据还将保存在链接的数据卷容器中。

我可以mongo使用mongo不装载任何卷的基本实例(dockerhub映像:psychemedia/mongo_nomount-本质上是不带该VOLUME /data/db语句的基本mongo Dockerfile )和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

其中与Dockerfile ./testdata.csv位于同一目录(./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用户指南建议:
创建容器时将初始化卷。
如果容器的基本映像在指定的安装点包含数据,则在卷初始化时将现有数据复制到新卷中
?因此,如果我将VOLUME命令放在种子RUN命令之后,我希望数据能够持久保存吗?

那我在做什么错?

从长远来看,我想自动化几个链接容器的构建,然后分发一个Vagrantfile/ docker-
compose的YAML文件,该文件将启动一组链接应用程序,其中包括一个预先mongo填充的数据库,该数据库带有(部分预先填充的)持久数据容器。


问题答案:

我使用另一个docker容器执行此操作,该容器的唯一目的是播种mongo,然后退出。我怀疑这与ebaxt的想法相同,但是当我寻找答案时,我只是想看看一个简单而又简单的示例。所以这是我的:

docker-compose.yml

mongodb:
  image: mongo
  ports:
    - "27017:27017"

mongo-seed:
  build: ./mongo-seed
  links:
    - mongodb

# my webserver which uses mongo (not shown in example)
webserver:
  build: ./webserver
  ports:
    - "80:80"
  links:
    - mongodb

mongo-seed / Dockerfile

FROM mongo

COPY init.json /init.json
CMD mongoimport --host mongodb --db reach-engine --collection MyDummyCollection --type json --file /init.json --jsonArray

mongo-seed / init.json

[
  {
    "name": "Joe Smith",
    "email": "jsmith@gmail.com",
    "age": 40,
    "admin": false
  },
  {
    "name": "Jen Ford",
    "email": "jford@gmail.com",
    "age": 45,
    "admin": true
  }
]


 类似资料:
  • 分发包含一些种子数据; 允许用户添加其他数据。 理想情况下,数据还将持久化在链接的数据卷容器中。 我可以使用不装入任何卷的基实例(dockerhub映像:-这基本上是没有语句的基mongo Dockerfile)和一个配置,将数据放入容器中: 其中与DockerFile位于同一目录()中。 我的docker-compose配置文件包括以下内容: 每当我尝试装入卷时,似乎会删除存储在中的原始种子数据

  • 我正在使用我的Mac上的docker-compose(使用boot2docker)与官方的WordPress Docker图像一起工作。我需要做一次一次性的数据导入。我不知道该怎么做。如何将数据导入数据库容器?

  • 我有一篇docker文章。yml,我有一个Postgres数据库,Grafana在上面运行以查询数据。 我用命令docker compose up启动这个compose,但是如果我不想丢失任何数据,我必须运行docker compose stop,而不是docker compose down。 我还阅读了,但“提交操作将不包括安装在容器内的卷中包含的任何数据”,所以我想它对我的需求没有用。 存储创

  • 问题内容: 我想使用Dockerizing MongoDB并将数据存储在本地卷中。 但是..失败了… 它具有mongo:latest图像 我想将单声道数据存储在〜/ data中。所以- 但是…行不通… docker ps-没有守护进程mongo 尝试运行“ mongo”-失败 码头工人检查蒙哥 如果我不设置数据量,mongo image就可以工作! 但是,当设置数据量时,它不是…谁可以帮助我? 问

  • 问题内容: 我已经按照Docker站点上的Django Quick Start指导紧密设置了Docker Django / PostgreSQL应用程序。 第一次运行Django的manage.py migration时,使用命令sudo docker-compose run web python manage.py migrate可以正常工作。该数据库建立在Docker PostgreSQL容器

  • 问题内容: 我想通过docker-compose建立映像并为其设置特定标签。文档说: Compose将使用生成的名称来构建并标记它,然后使用该图像。 但是我找不到指定标签的方法,对于生成的图像,我总是看到“最新”标签。 问题答案: 似乎文档/工具已更新,您现在可以将标记添加到脚本中。这对我来说是成功的。 例: https://docs.docker.com/compose/compose- fil