Докер Django - не удалось перевести имя хоста «db» на адрес: имя узла или имя сервера не указано или неизвестно

Я относительно новичок в Django и Docker и следую руководству по созданию мини-приложения. Однако я застреваю со следующей ошибкой:

django.db.utils.OperationalError: could not translate host name "db" to address: nodename nor servname provided, or not known

Мой файл docker-compose выглядит следующим образом:

 version: '3'
 services:
  db:
     image: 'postgres'
     ports:
       - '5432'
  core:
    build:
      context: .
      dockerfile: Dockerfile
    command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - '8000:8000'
    volumes:
      - .:/code
    depends_on:
      - db
    links:
      - db:db

Мой файл settings.py содержит базу данных:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'postgres',
    'USER': 'postgres',
    'HOST': 'db',
    'PORT': 5432,
}
}

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

Был бы признателен за некоторые рекомендации. Спасибо.

Можете ли вы оставить контейнер postgres запущенным и перезапустить только контейнер django и сказать мне, если вы все еще получаете ту же ошибку?

Mostafa Hussein 09.03.2019 21:48

Спасибо за ваш комментарий Мустафа. Извиняюсь, я все еще новичок в Docker, поэтому мне может понадобиться помощь. Я остановил докер. Как я могу просто запустить контейнер Postgres? Спасибо.

shbfy 09.03.2019 21:56
docker-compose restart core это перезапустит приложение без базы данных, поэтому сначала убедитесь, что база данных запущена, а затем выполните команду
Mostafa Hussein 09.03.2019 21:57

Спасибо. Все еще есть проблема, к сожалению.

shbfy 09.03.2019 22:01

Вы уверены, что контейнер postgres был запущен и не перезапустился, пока вы перезапускали приложение? Вы можете проверить время до docker ps ?

Mostafa Hussein 09.03.2019 22:02

Смотрите время безотказной работы: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 189666f6a2b7 vision_core "python3 manage.py r…" 4 minutes ago Up 3 minutes 0.0.0.0:8000->8000/tcp vision_core_1 af5402d6495f postgres "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:32769->5432/tcp vision_db_1

shbfy 09.03.2019 22:04

Давайте продолжить обсуждение в чате.

Mostafa Hussein 09.03.2019 22:05

Конечно. Спасибо за помощь :)

shbfy 09.03.2019 22:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
8
16 250
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Итак, вы пытаетесь получить доступ к базе данных, которая работает в одном контейнере, из другого контейнера? Если да - потенциально может помочь следующее, по крайней мере, это помогло мне, когда у меня были похожие проблемы.

Попробуйте определить конфигурацию сети в дополнение к ссылки в вашем компоновочном файле, создайте сеть с каким-нибудь именем и определите ее в обоих сервисах. Вроде описал здесь, так как доки по конфигу ссылки рекомендуют так делать.

Что-то вроде этого для вашего случая:

version: '3'
 services:
  db:
     image: 'postgres'
     ports:
       - '5432'
     networks:
      some_network:
  core:
    build:
      context: .
      dockerfile: Dockerfile
    command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - '8000:8000'
    volumes:
      - .:/code
    depends_on:
      - db
    links:
      - db:db
    networks:
      some_network:
  networks:
   some_network:

Это помогло мне разрешить имя хоста для подключения к БД.

Мне пришлось использовать docker-compose up, чтобы убедиться, что мой контейнер db работает.

Недавно я столкнулся с этой проблемой, я решил ее, добавив переменные среды postgres в db в моем файле docker-compose.yml, например так

version: '3'
 services:
  db:
     image: 'postgres'
     ports:
       - '5432'
     environment:
            - POSTGRES_DB=booksdb
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
  core:
    build:
      context: .
      dockerfile: Dockerfile
    command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - '8000:8000'
    volumes:
      - .:/code
    depends_on:
      - db
    links:
      - db:db

Я несколько дней искал решение этой проблемы. Вот что я сделал:

1 - я скопировал файл postgresql.conf.sample из моего контейнера postgres в папку моего проекта вы должны попасть в cd usr/share/postgresql с docker exec -it yourcontainer баш

2 - я изменил его имя на postgresql.conf

3 - я изменил эти переменные в postgresql.conf

    listen_addresses = '*'
    port = 5432             
    max_connections = 100           
    superuser_reserved_connections = 3
    unix_socket_directories = '/tmp'

4 - я добавил его в свой Dockerfile

COPY postgresql.conf      /tmp/postgresql.conf

5 - настройки.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'test',
        'USER': 'testing',
        'PASSWORD': 'tests',
        'HOST': 'localhost',
        'PORT': 5432,
    }
}

6 - Я сделал docker-compose up -build снова

В моем конкретном случае у меня был postgres без какой-либо версии, поэтому изображение postgres обновляется, а контейнер db (postgres) не встает

Вместо переопределения сетей используйте

docker-compose down -v

чтобы остановить все контейнеры и удалить все кэшированные данные.

потом

docker-compose up

перезапустить с нуля.

У меня работает следующая конфигурация из официального документация

version: "3.8"

services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

затем запустите эти команды:

docker-compose up -d --build   
docker-compose logs    
docker exec -it "container_name" python3 manage.py migrate

Это работает для меня. Убедитесь, что путь к файлу manage.py указан правильно.

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