Контейнер Mongo с набором реплик только с одним узлом в docker-compose

Я хочу создать контейнер Docker с экземпляром Mongo. В частности, я хотел бы создать набор реплик только с одним узлом (поскольку меня интересуют транзакции, а они доступны только для наборов реплик).

Докерфайл

FROM mongo
RUN echo "rs.initiate();" > /docker-entrypoint-initdb.d/replica-init.js
CMD ["--replSet", "rs0"]

докер-compose.yml

version: "3"
services:
  db:
    build:
      dockerfile: Dockerfile
      context: .
    ports:
      - "27017:27017"

Если я использую только Dockerfile, все в порядке, а если я использую docker-compose, он не работает: на самом деле, если я затем войду в контейнер, мне будет предложено как rs0:OTHER> вместо rs0:PRIMARY>.

Я проконсультировался по этим ссылкам, но предложенные решения не работают:

https://github.com/docker-library/mongo/issues/246#issuecomment-382072843 https://github.com/docker-library/mongo/issues/249#issuecomment-381786889


person StackUser    schedule 28.04.2020    source источник
comment
Забавный факт, что если я просто использую Dockerfile с docker build -t db .; docker run -p 27017:27017 -d db, все в порядке, но с docker-compose это не работает.   -  person StackUser    schedule 28.04.2020


Ответы (2)


Вам все равно нужно выполнить replSetInitiate, даже если в RS есть только один узел. .

См. также здесь.

person D. SM    schedule 28.04.2020
comment
Я делаю это в части RUN. - person StackUser; 28.04.2020
comment
В этом случае 1) убедитесь, что он выполнен и 2) просмотрите журналы сервера, чтобы узнать, что происходит на узле. - person D. SM; 28.04.2020
comment
Our replica set config is invalid or we are not a member of it — это сообщение, которое я получаю, если захожу в контейнер db и использую rs.status(). Но я не понимаю, почему это не работает только с docker-compose, а только с Dockerfile. - person StackUser; 28.04.2020
comment
Может ли узел связаться с самим собой, используя имя хоста, используемое в конфигурации RS? - person D. SM; 28.04.2020

Этот отлично работает для меня:

version: '3.4'

services:
  ludustack-db:
      container_name: ludustack-db
      command: mongod --auth
      image: mongo:latest
      hostname: mongodb
      ports:
      - '27017:27017'
      env_file:
      - .env
      environment:
      - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
      - MONGO_INITDB_DATABASE=${MONGO_INITDB_DATABASE}
      - MONGO_REPLICA_SET_NAME=${MONGO_REPLICA_SET_NAME}
      healthcheck:
        test: test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u $${MONGO_INITDB_ROOT_USERNAME} -p $${MONGO_INITDB_ROOT_PASSWORD} --quiet) -eq 1
        interval: 60s
        start_period: 60s
person programad    schedule 22.08.2020
comment
Я попробовал этот код, и он просто создал автономный сервер, а не набор реплик с одним узлом. Я проверил это, попытавшись запустить некоторые команды в транзакции, и получил эту ошибку: автономные серверы не поддерживают транзакции. - person John Knoop; 10.02.2021
comment
Я также получаю автономный сервер без набора реплик. - person Elbbard; 27.04.2021