mongodb - 使用 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
以减少手动工作吗?
解决方案
肯定有一种方法可以在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"
这里和那里可能存在一些语法错误,但这个想法与我在其他一些项目中使用此方法的想法相同:)
推荐阅读
- performance - Haskell中懒惰评估下的连接顺序和性能
- c# - 转换后如何使用变量
- dart - 什么是 Dart 原生实例
- python - 有没有更简单的方法来合并来自多个 DataFrame 块的 describe() 结果?
- firebase - 有没有办法通过用户的 UID 从 FirebaseAuth 中删除用户?
- python - lxml 如何定位和检索多个元素值?
- ocaml - 如何访问类型定义 OCaml 中的元素
- ios - use_framework 与 use_native_modules
- java - Java 无法识别 main 方法中的数组
- java - 如何在 Jenkins 自动执行战争文件?