首页 > 解决方案 > 使用 Docker 在 MongoDb 中自动运行设置副本集和恢复数据库

问题描述

这是我的 Dockerfile:

FROM mongo

WORKDIR /usr/src/app

COPY db /usr/src/app/db

COPY replica.js /usr/src/app/

CMD mongo

replica.js 如下

rs.initiate();

这是我的 docker-compose 文件

mongo_server:
    image: mongo
    hostname: mongo_server.$ENV_NAME
    build:
      context: ./mongo
      dockerfile: Dockerfile
    expose:
      - 27017
    ports:
      - "$MONGO_PORT:27017"
    restart: always
    networks:
      localnet:
        aliases:
          - mongo_server.$ENV_NAME
    command: --replSet $MONGO_REPLICA --bind_ip_all
    volumes:
      - "mongovolume:/data/db"

问题是如果我成功运行 docker-compose up。然后我需要手动运行两个命令

docker exec 2b2 sh -c "mongo < /usr/src/app/replica.js" # 2b2 is id of container mongo

docker exec 2b2 sh -c "mongorestore --drop -d mydb /usr/src/app/db"

现在副本已设置,数据库已恢复。我的问题是我可以自动完成,例如移动到entrypoint.sh呼叫Dockerfile或设置docker-compose.yml以减少手动工作吗?

标签: mongodbdocker

解决方案


肯定有一种方法可以在docker-compose文件中添加另一个容器:

mongo_restore:
    image: mongo
    build:
      context: ./mongo
      dockerfile: Dockerfile
    networks:
      localnet:
        aliases:
          - mongo_server.$ENV_NAME
    entrypoint:
      - sh
    command:
      - -c
      - |
        # Step 1: Wait until mongo_server is fully up and running. Please insert your own code to check.
        # Step 2: Execute your restore script but make sure to target mongo_server instead
    volumes:
      - "mongovolume:/data/db"

这里和那里可能存在一些语法错误,但这个想法与我在其他一些项目中使用此方法的想法相同:)


推荐阅读