Ошибка: getaddrinfo ENOTFOUND пытается подключиться к монго из контейнера

Я создал API, используя node.js

Я преобразовал его в изображение, выполнив команду docker build -t droneapi:1.0 используя этот Dockerfile.

FROM node:19-alpine

ENV MONGO_DB_USERNAME = admin \
    MONGO_DB_PWD=password

RUN mkdir -p /home/droneAPI

COPY . /Users/styles/Programming/DroneAPI2

CMD ["node", "/Users/styles/Programming/DroneAPI2/Drones/server.js"]

Я побежал docker run droneapi:1.0, чтобы создать контейнер для общения с моим контейнером mongodb, но получил сообщение об ошибке: getaddrinfo ENOTFOUND mongodb

Я использую мангуста, чтобы попытаться связаться с БД

onst connectDB = async () => {
    try{
        const conn = await mongoose.connect("mongodb://admin:password@mongodb:27017", {dbName: 'drobedb'})
        console.log(`MongoDB Connected: ${conn.connection.host}`.cyan.underline)

    }catch (error){
       console.log(`Error: ${error.message}`.red.underline.bold)
       process.exit(1)
    }
}

Я попытался заменить «mongodb» в строке подключения на localhost и получил Error: connect ECONNREFUSED 127.0.0.1:27017

Вот мой файл mongo.yaml

version: '3'
services:
    mongodb:
        image: mongo
        ports:
            - 27017:27017
        environment:
            - MONGO_INITDB_ROOT_USERNAME=admin
            - MONGO_INITDB_ROOT_PASSWORD=password
    mongo-express:
        image: mongo-express
        ports:
            - 8081:8081
        environment:
            - ME_CONFIG_MONGODB_ADMINUSERNAME=admin
            - ME_CONFIG_MONGODB_ADMINPASSWORD=password
            - ME_CONFIG_MONGODB_SERVER=mongodb

Я новичок в докере, поэтому буду признателен за любую помощь.

Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
0
199
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Когда мы запускаем контейнерный стек через compose-файл, для нас создается сеть для этого compose-стека, и все контейнеры привязываются к этой сети. Когда мы запускаем контейнер через docker run ..., он присоединяется к сети по умолчанию. Контейнеры в разных сетях не могут взаимодействовать друг с другом. Я бы порекомендовал добавить контейнер dronapi в файл компоновки:

version: '3'
services:
  ...
  drone-api:
    bulid:
      context: .
      dockerfile: path/to/Dockerfile
    ...
    depends_on:
      - mongodb # to start this container after mongodb has been started    

Если мы хотим запустить стек, мы можем запустить docker compose up -d. Обратите внимание, что если образ был создан ранее, он не будет автоматически перестроен. Чтобы восстановить образ, мы можем запустить docker compose up --build -d.


В качестве отступления: я бы рекомендовал следовать 12 факторам для облачных приложений (12factors.net) . В частности, я бы порекомендовал внедрить конфигурацию базы данных (12factors.net).

большое спасибо! это сработало. Позволь мне спросить. что делает контекстный тег?

zztopz 20.11.2022 18:25

Он определяет контекст сборки (в docker build .. обозначает контекст). В компоновочном файле dockerfile указан относительно context. Рекомендую прочитать соответствующую страницу документации (docs.docker.com).

Turing85 20.11.2022 18:32

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