Я относительно новичок в 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,
}
}
Я видел сообщения здесь и здесь, однако оба не устранили проблему.
Был бы признателен за некоторые рекомендации. Спасибо.
Спасибо за ваш комментарий Мустафа. Извиняюсь, я все еще новичок в Docker, поэтому мне может понадобиться помощь. Я остановил докер. Как я могу просто запустить контейнер Postgres? Спасибо.
docker-compose restart core это перезапустит приложение без базы данных, поэтому сначала убедитесь, что база данных запущена, а затем выполните команду
Спасибо. Все еще есть проблема, к сожалению.
Вы уверены, что контейнер postgres был запущен и не перезапустился, пока вы перезапускали приложение? Вы можете проверить время до docker ps ?
Смотрите время безотказной работы: 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
Давайте продолжить обсуждение в чате.
Конечно. Спасибо за помощь :)





Итак, вы пытаетесь получить доступ к базе данных, которая работает в одном контейнере, из другого контейнера? Если да - потенциально может помочь следующее, по крайней мере, это помогло мне, когда у меня были похожие проблемы.
Попробуйте определить конфигурацию сети в дополнение к ссылки в вашем компоновочном файле, создайте сеть с каким-нибудь именем и определите ее в обоих сервисах. Вроде описал здесь, так как доки по конфигу ссылки рекомендуют так делать.
Что-то вроде этого для вашего случая:
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 указан правильно.
Можете ли вы оставить контейнер postgres запущенным и перезапустить только контейнер django и сказать мне, если вы все еще получаете ту же ошибку?