Я искал в Интернете, но нигде не мог найти свой ответ. Я пытаюсь запустить веб-службу API, используя структуру NestJS.
Я запускаю docker-compose, который запускает сервер API, экземпляр MongoDB и экземпляр mongocryptd, чтобы разрешить шифрование на уровне поля на стороне клиента в моем приложении.
Я могу подключиться к экземпляру MongoDB, но не к экземпляру mongocryptd.
Файл Docker-Compose:
version: "3.7"
services:
api:
build:
context: .
dockerfile: Dockerfile
labels:
env: dev
args:
APP: appname
APP_PORT: 3000
ports:
- "3000:3000"
command: ["sh", "-c", "npm run start:app:dev"]
volumes:
- .:/app
mongodb:
build:
context: .
dockerfile: docker/MongoEP-Dockerfile
labels:
env: dev
args:
MONGO_PACKAGE: mongodb-enterprise
MONGO_REPO: repo.mongodb.com
image: mongo-enterprise:4.2.5
command: ["--auth"]
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: usr
MONGO_INITDB_ROOT_PASSWORD: pwd
ports:
- "27017:27017"
volumes: ["/private/var/services/mongodb:/data/db"]
mongocryptd:
build:
context: .
dockerfile: docker/MongoEP-Dockerfile
labels:
env: dev
args:
MONGO_PACKAGE: mongodb-enterprise
MONGO_REPO: repo.mongodb.com
image: mongo-enterprise:4.2.5
entrypoint: mongocryptd
restart: always
ports:
- "27020:27020"
volumes: ["/private/var/services/mongodb:/data/db"]
Используемый файл dockerfile является официальным файлом dockerfile mongo, но снабжен аргументами для создания корпоративной версии образа, которая включает корпоративные функции.
При попытке подключиться к базе данных из приложения я запускаю:
MongooseModule.forRoot(`mongodb://usr:pwd@mongodb:27017`, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
retryAttempts: 2,
autoEncryption: {
keyVaultNamespace,
kmsProviders,
extraOptions: {
mongocryptdURI: `mongodb://mongocryptd:27020`,
mongocryptdBypassSpawn: true
}
} as any
})
** Это версия NestJS для предоставления конфигураций. это похоже на мангуст - первый аргумент - это URI, а второй - объект настроек
Без параметров автошифрования я могу подключиться без проблем. Это означает, что мой адрес базы данных правильный. С параметрами autoEncyption я получаю MongooseServerSelectionError: connect ECONNREFUSED 172.25.0.4:27020
(адрес mongocryptd). Это означает, что IP правильный (DNS разрешен), но в соединении отказано. Как я показал ранее, порт (27020) публикуется файлом docker-compose, и я даже пытался добавить шаг EXPOSE в саму сборку.
НО когда я сопоставляю сеть контейнеров с хостом (network_mode: "host"
), приложение может подключаться без проблем (конечно, меняя DNS-подключения на localhost: 27017 и 27020). Так что это должно означать, что это проблема, связанная с докером.
Дополнительные вещи, которые я пробовал, && резюме того, что я пробовал:
- Прикрепите том для замены
/etc/mongod.conf.orig
со следующими сетевыми конфигурациями:
net:
port: 27017
bindIp: 0.0.0.0
bindIpAll: true
- Вместо присоединения тома замените его ^ на этапе сборки перед запуском службы монго.
- Я также попытался изменить
bindIp
на конкретный IP-адрес приложения, который был предоставлен сетью докеров. - Все типы строк подключения с учетными данными пользователя и без них, источником аутентификации и базой данных по умолчанию.
- Порт 27020 публикуется в docker-compose и отображается в файле docker.
У меня закончились идеи. Любая помощь приветствуется! :)
РЕДАКТИРОВАТЬ:
После дополнительной отладки я вижу, что mongod
работает с --bind_ip_all
по умолчанию, поэтому изменение файла conf не должно иметь эффекта. Пробовал также запустить mongocryptd
с точкой входа mongods docker-entrypoint.sh
вместо ее переопределения.