如何使用新的标志重新启动现有的MongoDB Docker容器daemon?

3

当前状态

  • 我在一台服务器上运行了一个没有副本集标志(--replSet)的MongoDB实例
  • 我在数据库中存储了一些以前的信息,并希望保留这些信息

目的

  • 我希望重启容器时将守护程序的--replSet "my-set"标志设置为副本集并保留先前的信息

实施

我正在尝试遵循使用Docker设置MongoDB副本集的教程,并在我的本地机器上尝试它。

  1. Create a standard MongoDB Docker container w/o the flag replSet set which represents the current state:

    docker run -d --name mongo_rs --publish 37017:27017 mongo
    
  2. Using the MongoDB Compass I connected to the DB and added some dummy information to a Database called test and collection called players

  3. I stop the container:

    docker container stop mongo_rs
    

从这里开始,我希望在mongo_rs容器中添加--replSet "my-set",并根据教程中提到的方法通过mongo Shell配置副本集。有哪些可能的解决方案?


1
很遗憾,您无法更新容器的 CMD。您只能更新此处提到的内容:docker update。备份您的数据库并使用您想要的标志启动一个新的容器。 - tgogos
还要检查这个:如何使用不同的命令启动已停止的Docker容器?。一个“hackish”的解决方案是进入您的容器配置,类似于/var/lib/docker/containers/<container_id>/config.json,进行修改,然后重新启动docker守护程序。 - tgogos
@tgogos 我正在研究这个问题。如果它是用 docker-compose 文件编写的,那么这件事会更容易吗? - Shan-Desai
我不认为在这种情况下docker-compose会有帮助。我会使用docker exec -it mongo_rs bash进入mongo容器,然后使用mongoexport将数据库保存到文件中。您可以使用docker cp ...将此文件复制到主机上,然后我会启动一个新的mongo容器,并尝试使用mongoimport从头开始创建数据库。 - tgogos
2个回答

2

这是我的.yml文件

version: '3.7'

services:
  node1:
    image: mongo 
    ports:
      - 30001:27017 
    volumes:
      - $HOME/mongoclusterdata/node1:/data/db 
    networks:
      - mongocluster
    command: mongod --replSet comments 
  node2:
    image: mongo
    ports:
      - 30002:27017
    volumes:
      - $HOME/mongoclusterdata/node2:/data/db
    networks:
      - mongocluster
    command: mongod --replSet comments
    depends_on :
      - node1 
  node3:
    image: mongo
    ports:
      - 30003:27017
    volumes:
      - $HOME/mongoclusterdata/node3:/data/db
    networks:
      - mongocluster
    command: mongod --replSet comments
    depends_on :
        - node2 

networks:
  mongocluster:
    driver: bridge 

卷部分有绝对路径,与根路径不同。实际上,Docker文件在根目录上创建自配置文件,因此如果您的docker-compose安装位置是根目录,请将其更改为其他位置,现在配置文件设置将永远不会在docker-install up/down时删除。


2

以下是解决方法:

1- 将入口脚本复制到您的主机上:

docker cp mongo_rs:/usr/local/bin/docker-entrypoint.sh .

2- 编辑脚本,将最后一行 exec "$@" 更改为:

mongod --replSet my-mongo-set --port 27017

3- 将脚本重新复制到您的容器中:

docker cp docker-entrypoint.sh mongo_rs:/usr/local/bin/docker-entrypoint.sh

4- 启动您的容器:

docker start mongo_rs

我认为这对我不起作用。我运行了(持久化数据)docker run --name mongo_rs -v (dir):(dir) -p 27017:27017 mongo,并停止容器docker stop mongo_rs,然后重新运行docker start mongo_rs,但它无法再次启动。我实现了新的入口点脚本,但仍然不起作用... - sutan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接