Это потому, что вы создали две службы базы данных.Один вручную через docker run
и один через docker-compose
.К сожалению, оба непригодны для использования, что означает, что для их взаимодействия потребуется перенастройка.
Сценарий 1 - с использованием отдельной БД
Вы должны удалить определение базы данных из composeфайл - чтобы он выглядел так:
version: '3'
services:
web:
image: 1ce04167758d
command: python manage.py runserver
volumes:
- .:/code
ports:
- "8000:8000"
И в вашей конфигурации вы должны изменить postgres
на свой хост-компьютер - например 192.168.1.2
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'itoucan',
'USER': 'mannu',
'PASSWORD': 'mysecretpassword',
'HOST': '192.168.1.2',
'PORT': 5432
}
}
Затем запуститеотдельная служба базы данных, такая же, как вы, с помощью команды run
, но публично выставляющая порт.
docker run --name postgres -it -p 5432:5432 -e POSTGRES_USER=mannu -e POSTGRES_PASSWORD=mysecretpassword postgres
Когда он завершит инициализацию и когда вы добавите базы данных и пользователей, вы можете запустить приложение Django, и оно подключится.
дальнейшее чтение по переменным postgres env
Сценарий 2 - использование составной базы данных
Здесь многое объясняется, каквам нужно настроить entrypoint
, который будет ждать, пока БД не будет полностью инициализирована.Но я уже написал пошаговый ответ о том, как это сделать здесь, в стеке
Ваша ситуация в основном такая же, за исключением службы БД.Вы оставляете свою композицию почти такой же, как сейчас, с небольшими изменениями:
version: '3'
services:
web:
image: 1ce04167758d
command: python manage.py runserver
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- postgres
entrypoint: ["./docker-entrypoint.sh"]
postgres:
image: postgres
env_file:
- .env
Я добавил entrypoint
, который должен ждать, пока ваша служба БД завершит инициализацию (для получения инструкций о том, как установитьэто вы должны ссылаться на ссылку, которую я предоставил ранее).
Я вижу, что вы уже определили точку входа - я бы предложил удалить эту entrypoint
из Dockerfile
, переместить ее в файл compose
и объединить с тем, что я описал вреферальная ссылка.Это обычная практика в коммерческих / более крупных средах, поскольку у вас может быть много entrypoint
с или / и поскольку ваш entrypoint
может быть не предназначен для работы во время сборки - как я предлагаю.
Я удалил отображение портов БД, так как вам не следует предоставлять сервисы, если в этом нет необходимости - если только сервис web
должен использовать БД, то мы не должны предоставлять БД для других возможностей.,
При вышеуказанной конфигурации ваша конфигурация Django будет в порядке.
редактировать из комментариев
IP-адрес 0.0.0.0
, предоставленный для postgres, указывает, что сервер будет прослушивать все входящие соединения.Это означает, что в settings.py
вы должны указать не адрес 0.0.0.0
, а адрес хоста, на котором работает ваша служба - в вашем случае, я полагаю, она работает на вашем компьютере - поэтому просто запустите:
$ ifconfig
на вашем хосте даст ваш локальный IP-адрес (192.x.x.x
или 10.x.x.x
), и этот IP-адрес будет указан в settings