ECS上运行的Mongo修改配置文件重启后变更丢失该如何处理
问题原因
- 容器默认采用不可变架构设计,所有运行时对容器内部文件系统的修改都保存在临时可写层,当容器被销毁重建(比如服务重启、实例重新调度)时,临时层所有数据会被清空,你直接exec进入容器安装软件、修改配置的操作自然无法保留。
- 你修改的
mongod.conf.orig是Mongo配置的原始备份文件,本身不会被Mongo服务加载,即使容器不重启,修改该文件也不会生效。 - MongoDB默认会读取所在运行环境的总内存大小自动计算WiredTiger缓存值,默认规则为
(总内存 - 1GB)/2。你的Mongo容器未配置内存限制,所以读取到了宿主机/节点的总内存(16G),计算出的缓存大小超出了ECS实际可用的8G内存,最终触发OOM崩溃。
永久生效的修改方案
方案1:通过Copilot服务配置传入自定义配置文件(推荐)
- 首先在你的Copilot项目目录下对应服务的manifest文件(默认路径为
copilot/<服务名>/manifest.yml)中添加挂载配置,将本地自定义的Mongo配置文件直接挂载到容器内的生效路径。 - 本地新建自定义Mongo配置文件,命名为
mongod.conf,添加配置调整缓存大小:
storage: wiredTiger: engineConfig: cacheSizeGB: 3 # 8G内存的ECS建议设为3~4G,预留足够内存给系统和Mongo其他进程
- 编辑manifest.yml,添加配置文件挂载、启动命令、内存限制规则:
# 挂载本地配置文件到容器 volumes: - name: mongo-config path: /etc/mongod.conf # 可根据你使用的Mongo镜像默认配置路径调整 read_only: true source: path: ./mongod.conf # 此处为本地配置文件相对Copilot项目根目录的路径 # 覆盖启动命令指定加载自定义配置 command: ["mongod", "--config", "/etc/mongod.conf"] # 配置容器内存上限,避免内存超出ECS配额 resources: memory: 7G
- 所有配置修改完成后执行
copilot svc deploy重新部署服务即可,配置会永久生效。
方案2:构建自定义Mongo镜像
如果你需要预装vim等工具,或者有更多自定义修改,可以自行构建基于官方Mongo镜像的自定义镜像:
- 新建Dockerfile:
FROM mongo:<你当前使用的Mongo版本号> # 预装需要的工具 RUN apt-get update && apt-get install -y vim && rm -rf /var/lib/apt/lists/* # 复制自定义配置文件到镜像内默认加载路径 COPY ./mongod.conf /etc/mongod.conf
- 构建镜像并上传到镜像仓库后,修改Copilot manifest中的镜像配置为你自定义的镜像地址,重新部署即可,所有镜像内的修改都会永久保留。
内容的提问来源于stack exchange,提问作者Hilda Chang
相关产品推荐
相关产品推荐

