docker-compose使用--config启动mongodb出错的采坑记录

网上有很多关于docker-compose安装mongodb的笔记,但是对于实用config启动记录太少,我踩了一下的坑重要把这些问题都走了一遍,记录下帮助那些跟我一样遇到问题的人

一、系统环境介绍

  1. 系统使用的是华为云服务器,ubuntu18.04
  2. 安装docker-ce 版本是19.03.9 最新稳定版
  3. docker-compose 版本是1.25.5 最新的稳定版
  4. 下载mongodb镜像是4.2.6

二、最原始的设置

  1. docker-compose.yml的内容
version: '3.8'
networks:
  mynet:
    external: true
services:
  mongodb:
    image: mongo:4.2.6
    networks:
      - mynet
    env_file:
      - ./.env
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /data/mongo_cluster/2727/db:/data/mongo/db
      - /data/mongo_cluster/2727/log:/data/mongo/log
      - /data/mongo_cluster/2727/2727.conf:/data/mongo/mongo.conf
    container_name: mongo_main
    environment:
      - MONGO_INITDB_ROOT_USERNAME=qumogu
      - MONGO_INITDB_ROOT_PASSWORD=xxxxsss
    command: mongod -- config /data/mongo/mongo.conf
    ports:
      - 2727:27017
    restart: always
    logging:
      driver: json-file
      options:
        max-file: '2'
        max-size: 100m

  1. mongo.conf配置文件内容
logpath=/data/mongo/log/mongo.log
logappend=true
fork = true
port = 27027
dbpath=/data/mongo/db
cpu = true
auth = true
bind_ip = 0.0.0.0
maxConns = 100
objcheck = true
pidfilepath = /data/mongo/run/mongo.pid

三、启动报错情况

  1. 第一错误:mongodb forked process: 48 ERROR: child process failed, exited with error number 1
  2. 第二错误:error (at /tmp/docker-entrypoint-config.json:1): Cannot index string with string "systemLog"
  3. 第三错误:child process successful,parent failed

四、配置的问题

  1. docker-compose.yml的配置问题:

    • command 后面不需要再用mongod了,因为官方docker镜像已经用了,详情情况dockerfile链接
    • mongodb容器里面,使用的用户是mongodb,不是root,如果不是容器里原有的目录,挂载后mongodb就无权读取,这是就是错误1的原因。
    • 默认的容器里面,/data/db 和 /data/configdb mongodb用户是有权限,所以,挂载文件就放在这些目录下
    • volumes 挂载目录和文件不一样,不能用挂载目录的方式,挂载文件
  2. mongo.conf的配置问题

    • fork = true 这个配置,导致第三个错误,找不到父进程,系统无法启动,所以需要去除

五、修改后配置

  1. docker-compose.yml
version: '3.8'
networks:
  mynet:
    external: true
services:
  mongodb:
    image: mongo:4.2.6
    networks:
      - mynet
    env_file:
      - ./.env
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /data/mongo_cluster/2727/db:/data/db
      - /data/mongo_cluster/2727/opt:/data/configdb
    container_name: mongo_main
    environment:
      - MONGO_INITDB_ROOT_USERNAME=qumogu
      - MONGO_INITDB_ROOT_PASSWORD=xxxxsss
        # command: --auth --bind_ip 0.0.0.0 --logpath=/data/configdb/log/db.log
    command: --config /data/configdb/mongo.conf
    ports:
      - 2727:27017
    restart: always
    logging:
      driver: json-file
      options:
        max-file: '2'
        max-size: 100m

  1. mongo.conf
port = 27017
dbpath=/data/db
maxConns = 10000
auth = true
bind_ip = 0.0.0.0
logpath=/data/configdb/log/mongo.log
logappend=true
objcheck = true

  1. yml配置文件里直接接参数,可能比conf文件,更方便,或者在官方镜像的基础再用dockerfile制作一个镜像会更方便
    https://www.cnblogs.com/xsi640/p/3765911.html