Docker/ Django/ Postgres - не удалось перевести имя хоста "db" в адрес: Имя или служба неизвестны
Несколько дней назад я задал вопрос об ошибке Postgres.
Я последовал вашим рекомендациям, и они немного помогли, но помимо того, что не решили мою проблему, возникли новые проблемы.
У меня есть приложение django-postgres, которое работает локально без проблем. Когда я пытаюсь собрать образ docker, он собирается, но когда я пытаюсь установить контейнер, у меня возникает следующая ошибка:
django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known
Я покажу вам свой Dockerfile:
# Origin image
FROM python:3.8
RUN apt-get update
# Define directory
RUN mkdir /project
WORKDIR /project
# Install requirements
RUN apt-get install -y vim
RUN python -m pip install --upgrade pip
COPY requirements.txt /project/
RUN pip install -r requirements.txt
COPY . /project/
# Expose some ports
EXPOSE 22 5432 8080 8009 8000
# default command
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
А вот мой файл docker-compose:
version: "3.3"
services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
ports:
- "5432:5432"
environment:
- POSTGRES_NAME=plataforma
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=administrador
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
environment:
- POSTGRES_NAME=plataforma
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=administrador
depends_on:
- db
env_file:
- ./plataforma/.env
В settings.py я настраиваю базу данных таким образом:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': env('POSTGRESQL_NAME'),
'USER': env('POSTGRESQL_USER'),
'PASSWORD': env('POSTGRESQL_PASS'),
'HOST': env('POSTGRESQL_HOST'),
'PORT': env('POSTGRESQL_PORT'),
}
}
А это мой .env файл:
POSTGRESQL_NAME=plataforma
POSTGRESQL_USER=admin
POSTGRESQL_PASS=administrador
POSTGRESQL_HOST=db
POSTGRESQL_PORT=5432
Когда я запускаю свое приложение локально, я использую localhost
вместо db
для POSTGRESQL_HOST
.
Теперь, когда я запускаю $ sudo docker-compose run web python manage.py runserver .
, образ собирается и контейнер базы данных запускается, но контейнер приложения останавливается. Если я запускаю $ docker start container-name
, он не запускается.
Если я запускаю $ docker run -d --restart always --name new-container-name image-name
новый контейнер запускается правильно, и если я попадаю внутрь него и пытаюсь сделать django миграции, у меня возникает та же ошибка:
/usr/local/lib/python3.8/site-packages/django/core/management/commands/makemigrations.py:105: RuntimeWarning: Got an error checking a consistent migration history performed for database connection 'default': could not translate host name "db" to address: Name or service not known
Возможно, я неправильно использую файл docker-compose. Я пытался установить postgres из Dockerfile напрямую, но там у меня ошибка из моего последнего вопроса:
django.db.utils.OperationalError: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
Также я пробовал это решение и это решение, но они тоже не сработали.
Итак, я буквально потерялся. Я также прочитал это docker Quickstart, но я не понимаю, что я делаю неправильно.
Может ли кто-нибудь помочь мне?
Извините, если я неправильно понимаю некоторые правила stackoverflow, но я все еще выясняю, как это работает.
Спасибо!
Ваш файл .env
- это просто удобный способ задать переменные окружения при разработке. Он должен игнорироваться вашей системой контроля версий и не должен использоваться на Heroku.
Вместо этого в Heroku есть config vars. (Они также являются просто удобным способом установки переменных окружения, но это правильный способ сделать это на Heroku.)
Но вам не нужно устанавливать это самостоятельно. Heroku Postgres автоматически устанавливает config var под названием DATABASE_URL
, который вы должны использовать при подключении к вашей базе данных. В Django наиболее удобным вариантом является использование
dj-database-url
, например, где вы переопределите вашу базу данных по умолчанию чем-то вроде этого из документации:import dj_database_url DATABASES['default'] = dj_database_url.config(conn_max_age=600, ssl_require=True),
или
django-on-heroku
(который имеет более широкую область применения), в этом случае вы сделаете что-то вродеimport django_on_heroku django_on_heroku.settings(locals())
в конце вашего settings.py
.
В любом случае, это полностью заменяет ваш контейнер db
. Вместо этого вы будете использовать размещенную базу данных, предоставляемую Heroku Postgres.