docker-compose 在 mongoDB 中创建复制

Dha*_*thy 3 docker dockerfile docker-compose

我正在设置一个 docker 容器来使用 docker compose 初始化 Mongo DB 副本集。我无法完成这项工作。我创建了 docker-compose 来调用三个 mongo 实例,但我遇到了解析器问题。下面是我的Docker-Compose文件。

version: '3'
services:
 mongo-vauto-1:    
    image: "mongo-start"
    build: ./mongo-vAUTO-1
    ports:
      - "30000:27017"
    volumes:
      - ./mongo-vAUTO-1/data:/data/db
    depends_on:
      - "mongo-vauto-2"
      - "mongo-vauto-3"

 mongo-vauto-2:
    image: "mongo"
    command: --replSet vAUTO --smallfiles --oplogSize 128
    ports:
      - "40000:27017"
    volumes:
      - ./mongo-vAUTO-2/data:/data/db

 mongo-vauto-3:
    image: "mongo"
    command: --replSet vAUTO --smallfiles --oplogSize 128
    ports:
      - "50000:27017"
    volumes:
      - ./mongo-vAUTO-3/data:/data/db

 mongo-setup-vauto:
    image: "mongo-setup-vauto"
    build: ./setup
    depends_on:
      - "mongo-vauto-1"
Run Code Online (Sandbox Code Playgroud)

它调用./setup 文件夹中的Dockerfile。下面是我设置的 Dockerfile

FROM mongo

# Create app directory
WORKDIR vauto-docker/src/config

# Install app dependencies
COPY replicaSet.js .
COPY setup.sh .

CMD ["./setup.sh"]
Run Code Online (Sandbox Code Playgroud)

它调用replicaSet.jssetup.sh。下面提供了 replicaSet.js 和 setup.sh 文件

# replicaSet.js
rsconf = {
    _id : "vAUTO",
    members: [
        {_id : 0, host : "mongo-vauto-1:27017"},
        {_id : 1, host : "mongo-vauto-2:27017"},
        {_id : 2, host : "mongo-vauto-3:27017"}
    ]
}
rs.initiate(rsconf);
rs.conf();


#  setup.sh 
echo *********************************
echo Starting the replica set
echo *********************************

sleep 10 | echo waiting for the replica set to be intialized
mongo mongodb://mongo-vauto-1:27017 replicaSet.js
Run Code Online (Sandbox Code Playgroud)

下面给出了第一个副本集的Dockerfile

FROM mongo
WORKDIR vauto-docker/src/config
copy mongo.conf .
EXPOSE 27017
CMD ["--config","./mongo.conf"]
Run Code Online (Sandbox Code Playgroud)

我的 mongo.conf 文件有以下代码

replication:
  oplogSizeMB: 1024
  replSetName: vAUTO
Run Code Online (Sandbox Code Playgroud)

我收到以下错误,

mongo-vauto-1_1      | parse error: Invalid numeric literal at line 1, column 14
mongo-vauto-1_1      | parse error: Invalid numeric literal at line 1, column 14
mongo-vauto-1_1      | Error parsing YAML config file: yaml-cpp: error at line 3, column 1: illegal tab when looking for indentation
Run Code Online (Sandbox Code Playgroud)

小智 16

这是我在 3 个 mongodb 容器运行后使用第 4 个容器初始化副本集的方法:

Docker-compose 文件

version: '3'
services:

  mongodb1:
    image: mongo:latest
    networks:
      - alphanetwork
    volumes:
      - data1:/data/db
      - config1:/data/configdb
    ports:
      - 30001:27017
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]

  mongodb2:
    image: mongo:latest
    networks:
      - alphanetwork
    ports:
      - 30002:27017
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]

  mongodb3:
    image: mongo:latest
    networks:
      - alphanetwork
    ports:
      - 30003:27017
    entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]

  mongoclient:
    image: mongo
    networks:
      - alphanetwork
    depends_on:
      - mongodb1
      - mongodb2
      - mongodb3
    volumes:
      - ./deployment_scripts:/deployment_scripts
    entrypoint:
      - /deployment_scripts/initiate_replica.sh

networks:
  alphanetwork:

volumes:
  data1:
  config1:
Run Code Online (Sandbox Code Playgroud)

启动副本.sh

#!/bin/bash

echo "Starting replica set initialize"
until mongo --host mongodb1 --eval "print(\"waited for connection\")"
do
    sleep 2
done
echo "Connection finished"
echo "Creating replica set"
mongo --host mongodb1 <<EOF
rs.initiate(
  {
    _id : 'rs0',
    members: [
      { _id : 0, host : "mongodb1:27017" },
      { _id : 1, host : "mongodb2:27017" },
      { _id : 2, host : "mongodb3:27017" }
    ]
  }
)
EOF
echo "replica set created"
Run Code Online (Sandbox Code Playgroud)

并且不要忘记chmod +x ./deployment_scripts/initiate_replica.sh授予 docker 执行它的权限。

  • 最好的解决方案。应选为正确答案。 (2认同)