Zend Framework 2 + докер: MongoDB ConnectionTimeoutException

Я использую Zend Framework 2 и MongoDB v3.2.11.

Когда я запускаю свое приложение ZF, получаю следующую ошибку:

Fatal error: Uncaught MongoDB\Driver\Exception\ConnectionTimeoutException: No suitable servers found (serverSelectionTryOnce set) in /var/www/project/vendor/mongodb/mongodb/src/Collection.php on line 360

Вот мой docker-compose:

mongodb:
    image: mongo:3.2.11
    restart: always
    container_name: mongodb
    environment:
      - MONGO_DATA_DIR=/data/project
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=mongopassword
    volumes:
      - mongodb-data:/data/project
    ports:
      - "27017:27017"
    command: mongod --smallfiles

Вот моя конфигурация ZF:

'caches' => [
        'Project\Web\Cache\Sessions' => [
            'template' => 'mongodb',
            'adapter' => [
                'name' => 'Project\Common\Cache\Storage\Adapter\MongoDb',
                'options' => [
                    'server' => getenv('ZF_MONGO_HOST'),
                    'connection_options' => [
                        'connect' => true,
                        'connectTimeoutMS' => 5000,
                        'fsync' => true,
                        'readPreference' => 'primaryPreferred',
                        'replicaSet' => 'set-1',
                    ],
                    'database' => getenv('ZF_MONGO_DATABASE_NAME'),
                    'collection' => 'sessions',
                    'ttl' => 3600,
                ],
            ],
        ],
    ],

Вот мой docker-compose.env:

## MONGO DB ##
ZF_MONGO_HOST=mongodb://my_user:mymongopassword@mongodb/my_db
ZF_MONGO_DATABASE_NAME=my_db

Что я пробовал: * Когда подключаюсь к mongodb, работает * Я проверил учетные данные пользователя: работает * Когда я меняю ZF_MONGO_HOST, я получаю ту же ошибку, но в скобках я вижу, что он не может подключиться к - неправильному - URL. Итак, все в порядке. * Поиск в Google в течение ~ 3 часов: все ошибки связаны с офлайн-серверами mongodb ...

Любые идеи?

Обновлять:

Я опробовал изображение битнами, выполнив следующие настройки:

  mongodb:
    image: bitnami/mongodb:3.6.8
    restart: always
    container_name: mongodb
    environment:
      - MONGODB_USERNAME=my_user
      - MONGODB_PASSWORD=mymongopassword
      - MONGODB_DATABASE=my_db
    volumes:
      - mongodb-data:/data/db-bitnami
    ports:
      - "27017:27017"

Та же ошибка.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
191
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После докера docker-compose up подключитесь к базе данных MongoDB и введите rs.status(), и в нем должно быть поле member, указывающее, что это ведомое устройство. если он не установлен, вам нужно определить его в mongodb:

rs.initiate( {
   _id : "set-1",
   members: [
      { _id: 0, host: "mongodb0.example.net:27017" },
      { _id: 1, host: "mongodb1.example.net:27017" },
      { _id: 2, host: "mongodb2.example.net:27017" }
   ]
})

после этого шага ваш mongodb был скопирован и готов к использованию. для автоматизации второй части этого (config mongodb) вы можете написать сценарий bash, который работает как Entrypoint в файле docker-compose, или использовать реплицированные образы докеров, такие как битнами.

Здорово! Некоторый прогресс! Я добавил localhost: 27017, когда я пытаюсь добавить mongodb: 27017 (это мое сетевое имя в docker-compose), я получаю сообщение об ошибке. Когда я опускаю mongodb, я получаю в php ошибку connection refused calling ismaster on 'localhost:27017'. Любые идеи?

Ron 12.12.2018 15:25

@Ron необходимо указать имя набора реплик MONGODB_REPLICA_SET_MODE=primary

amir 12.12.2018 22:41

Ок, отлично. Теперь я снова получаю свою "обычную" ошибку: ConnectionTimeoutException: No suitable servers found ('serverSelectionTryOnce' set)

Ron 13.12.2018 09:09

@Ron Я не знаю о PHP, но какова ваша строка подключения MongoDB в env?

amir 13.12.2018 10:43
ZF_MONGO_HOST=mongodb://my_user:mymongopassword@mongodb:2701‌​7/my_db
Ron 13.12.2018 13:57

@Ron, по-видимому, хост mongodb плохо определен в системе, но вы можете подключить его напрямую по IP-адресу. получить ip с docker inspect mongodb | grep ip и использовать его вместо имени хоста.

amir 13.12.2018 17:15

Извините, ничего не меняет ... Действительно странно. Дальнейшие идеи?

Ron 14.12.2018 09:52

Другие вопросы по теме