Форум программистов, компьютерный форум, киберфорум
Docker, Kubernetes
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
15 / 2 / 1
Регистрация: 18.09.2015
Сообщений: 227

Контейнер с приложением django не подключается к контейнеру postgres (docker-compose)

10.10.2020, 23:50. Показов 9184. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возникла проблема с разворачиванием проекта на django в docker.

Джанговское приложение не хочет подключаться к postgres, хотя порт 5432 открыт для прослушивания и в контейнере приложения django и в контейнере postgres. В точности, выдает следующую ошибку:

Code
1
2
3
4
5
6
File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 127, in connect
society     |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
society     | django.db.utils.OperationalError: could not connect to server: Connection refused
society     |   Is the server running on host "127.0.0.1" and accepting
society     |   TCP/IP connections on port 5432?
society     |
Вопрос, как заставить django-вский контейнер увидеть postgres и нормально к нему подключиться?
Ниже приведен код файлов, относящихся к проблеме.

docker-compose.yml
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
version: "3.3"
 
services:
 
    society:
        build: ./society
        container_name: society
        restart: always
        expose:
            - 5432
            - 6379
        ports:
            - 8888:8888
 
    nginx:
        build: ./nginx
        container_name: nginx
        restart: always
        volumes:
            - "./society/forum/static:/home/static"
            - "./society/media:/home/media"
        expose:
            - 8888
        ports: 
            - 80:80
            - 8000:8000
 
    postgres:
        build: ./postgres
        container_name: postgres
        restart: always
        environment:
            - POSTGRES_PASSWORD="postgres"
        expose:
            - 5432
 
    redis:
        image: redis:latest
        container_name: redis
        restart: always
        expose:
            - 6379
settings.py
Code
1
2
3
4
5
6
7
8
9
10
DATABASES = {
    'default':{
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'test',
        'USER' : 'daniil',
        'PASSWORD' : 'danko313',
        'HOST' : '127.0.0.1',
        'PORT' : '5432'
    }
}
Dockerfile - для postgres
Code
1
2
3
FROM postgres:10.12
 
COPY ./init.sh /docker-entrypoint-initdb.d/
init.sh
Code
1
2
3
4
5
6
7
8
9
#!/bin/bash
 
set -e
 
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER daniil WITH PASSWORD "danko313";
    CREATE DATABASE test WITH OWNER daniil;
    GRANT ALL PRIVILEGES ON DATABASE test TO daniil;
EOSQL
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.10.2020, 23:50
Ответы с готовыми решениями:

Линкование go app контейнера к другому контейнеру с docker-compose
Как прилинковать go app контейнера к другому node.js контейнеру с docker-compose? есть ли пример кода на golang как это можно...

Docker-compose: nginx-php-fpm-postgres
Люди добрые помогите собрать контейнер, уже битый час мучаюсь каждый раз выскакивают новые ошибки Заранее СПАСИБО Собрать docker stack...

Не подключается к mysql контейнеру docker
Здравствуйте. Имеется контейнер с оф. образом mysql. Поднимаю контейнер docker-compose up -d (композ для будущего). Сам docker-compose.yml:...

13
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
12.10.2020, 01:22
В host указом postgres
1
15 / 2 / 1
Регистрация: 18.09.2015
Сообщений: 227
12.10.2020, 02:36  [ТС]
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
В host указом postgres
Имеется в виду указать в settings.py Django?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
12.10.2020, 03:47
Лучший ответ Сообщение было отмечено Dancing_god как решение

Решение

Цитата Сообщение от Dancing_god Посмотреть сообщение
Имеется в виду указать в settings.py Django?
да, относительно контейнера с джанго, постгрес будет не 127.0.0.1, поэтому 'HOST' нужно поправить.
1
15 / 2 / 1
Регистрация: 18.09.2015
Сообщений: 227
12.10.2020, 12:37  [ТС]
Цитата Сообщение от Jabbson Посмотреть сообщение
постгрес будет не 127.0.0.1
Видимо я тогда не очень понимаю логику работы сетей в docker-compose. Немного непонятно, почему приложение Django не может слушать свой локальный адрес 127.0.0.1:5432, открытый в данном контейнере в стандартной сети bridge, передавая и принимая информацию как раз в этой сети на открытый локальный порт 127.0.0.1:5432 контейнера с postgres?

И при исправлении "HOST" на postgres, последнее - имя контейнера?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
12.10.2020, 18:17
Все верно, у каждого контейнера свой ip и свое имя. Нижу минимальный пример.

# создаю новую бридж сеть
Code
1
2
user@host:~$ docker network create --subnet 10.100.100.0/24 CustomNetwork
dcbf0b00f7e2818cabf400a4678169b3c04b974a2dfcc9174e2e4ca3468ee7f8
# создаю контейнер №1
Code
1
2
user@host:~$ docker run -it -d --name "container1" --net="CustomNetwork" "busybox"
da67f9bca095aa61eaa78668f0e1c43cef2a279a25bcb44d6f23ea0c88f59525
# создаю контейнер №2
Code
1
2
user@host:~$ docker run -it -d --name "container2" --net="CustomNetwork" "busybox"
64c3b8493631c816e6e8c65f8deab5b4ba8ed101bd6e7a779bd1ea7133e31e9e
# захожу в контейнер №1 и пингую контейнер №2 по имени
Code
1
2
3
4
5
6
7
8
9
10
user@host:~$ docker exec -it container1 /bin/sh
/ # ping container2
PING container2 (10.100.100.3): 56 data bytes
64 bytes from 10.100.100.3: seq=0 ttl=64 time=0.211 ms
64 bytes from 10.100.100.3: seq=1 ttl=64 time=0.128 ms
64 bytes from 10.100.100.3: seq=2 ttl=64 time=0.088 ms
^C
--- container2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.088/0.142/0.211 ms
1
15 / 2 / 1
Регистрация: 18.09.2015
Сообщений: 227
13.10.2020, 16:33  [ТС]
Цитата Сообщение от Jabbson Посмотреть сообщение
Все верно, у каждого контейнера свой ip и свое имя. Нижу минимальный пример.
Спасибо, понял. А как тогда правильно инициализировать базу данных в контейнере?
Есть на данный момент такой bash-скрипт:
init-user-db.sh
Bash
1
2
3
4
5
6
7
8
9
#!/bin/bash
 
set -e
 
psql -v ON_ERROR_STOP=1 -U postgres <<-EOSQL
    CREATE USER daniil WITH PASSWORD "danko313";
    CREATE DATABASE test WITH OWNER daniil;
    GRANT ALL PRIVILEGES ON DATABASE test TO daniil;
EOSQL
Dockerfile - для Postgres
Code
1
2
3
4
FROM postgres:10.12
 
COPY ./init-user-db.sh /docker-entrypoint-initdb.d/
CMD ["bash", "/docker-entrypoint-initdb.d/init-user-db.sh"]
Тем не менее инициализации не происходит, postgres вылетает с ошибкой:
Code
1
2
3
4
psql: could not connect to server: No such file or directory      
postgres    |   Is the server running locally and accepting
postgres    |   connections on Unix domain socket "/var/run/postgresql/.s.PGSQL$
5432"?
Хотя аналогичный запуск psql:
Code
1
psql -v ON_ERROR_STOP=1 -U postgres
Внутри контейнера через
Code
1
docker exec
Позволяет использовать командный интерфейс postgres.
Исходя из ошибки я понимаю, что автоматически linux пытается подключиться к postgres через unix-socket. И это не особо понятно, ведь docker-контейнер с django нормально подключается к postgres через ip-адрес.
Попытка указать в скрипте:
Code
1
-h 127.0.0.1 -p 5432
дает ту же самую ошибку.
Как в таком случае правильно настроить БД через bash скрипт?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
13.10.2020, 17:49
CMD ["bash", "/docker-entrypoint-initdb.d/init-user-db.sh"]

Это лишнее. Все скрипты, положенные в папку /docker-entrypoint-initdb.d/ будут выполнены при инициализации контейнера, отдельно запускать из не нужно.

Добавлено через 34 минуты
Цитата Сообщение от Dancing_god Посмотреть сообщение
CREATE USER daniil WITH PASSWORD "danko313";
тут замените двойные кавычки на одинарные

Добавлено через 6 минут
и разберитесь что и где "expose"-ить.

Добавлено через 46 секунд
плюс в дефолтной bridge сети dns имена на разрешаются, по-моему, создайте свою.
1
15 / 2 / 1
Регистрация: 18.09.2015
Сообщений: 227
13.10.2020, 18:11  [ТС]
Цитата Сообщение от Jabbson Посмотреть сообщение
тут замените двойные кавычки на одинарные
Заменил. Также убрал команду запуска скрипта через bash. Просто копирую скрипт в /docker-entrypoint-initdb.d/

Выдает ошибку при обращении по адресу, который слушает контейнер с nginx:
Code
1
django.db.utils.OperationalError: FATAL:  password authentication failed for user "daniil"
И при проверке существующих пользователей в postgres в контейнере в списке daniil не значится. Хотя при запуске контейнера никаких ошибок не выдает. Складывается впечатление, что скрипт инициализации всё же не запускается вместе с контейнером.
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
13.10.2020, 18:35
Скрипты исполняются только при старте контейнера, если база пустая.

Минимальный пример.

# Содержимое init-user-db.sh
Code
1
2
3
4
5
6
7
8
9
10
jabbson@vm55613:~/docker-tests$ cat init-user-db.sh
#!/bin/bash
 
set -e
 
psql -v ON_ERROR_STOP=1 -U postgres <<-EOSQL
    CREATE USER daniil WITH PASSWORD 'danko313';
    CREATE DATABASE test WITH OWNER daniil;
    GRANT ALL PRIVILEGES ON DATABASE test TO daniil;
EOSQL
# Содержимое Dockerfile
Code
1
2
3
jabbson@vm55613:~/docker-tests$ cat Dockerfile
FROM postgres:10.12
COPY ./init-user-db.sh /docker-entrypoint-initdb.d/
# Создаю образ
Code
1
2
3
4
5
6
7
8
jabbson@vm55613:~/docker-tests$ docker build --rm -t db .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM postgres:10.12
 ---> b500168be260
Step 2/2 : COPY ./init-user-db.sh /docker-entrypoint-initdb.d/
 ---> 3ad0b05af8cc
Successfully built 3ad0b05af8cc
Successfully tagged db:latest
# Запускаю контейнер
Code
1
2
jabbson@vm55613:~/docker-tests$ docker run --name cnt -it -e POSTGRES_PASSWORD=password -d db
e3b56e478396564257352b07bbb6c557567f91adc715a9e1819e259910976414
# Проверяю ip контейнера
Code
1
2
jabbson@vm55613:~/docker-tests$ docker inspect cnt | grep IPAddress
            "IPAddress": "172.17.0.3",
# Устанавливаю соединение с базой и выполняю простой запрос
Code
1
2
3
4
5
6
7
8
9
10
11
12
jabbson@vm55613:~/docker-tests$ psql -h 172.17.0.3 -U daniil -d test
Password for user daniil: <ввожу danko313>
psql (10.14 (Ubuntu 10.14-0ubuntu0.18.04.1), server 10.12 (Debian 10.12-2.pgdg90+1))
Type "help" for help.
 
test=> select 1 as one;
 one
-----
   1
(1 row)
 
test=>
# Пользователь в базе
Code
1
2
3
4
5
6
test=> \du+
                                          List of roles
 Role name |                         Attributes                         | Member of | Description
-----------+------------------------------------------------------------+-----------+-------------
 daniil    |                                                            | {}        |
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}        |
1
15 / 2 / 1
Регистрация: 18.09.2015
Сообщений: 227
13.10.2020, 19:01  [ТС]
Цитата Сообщение от Jabbson Посмотреть сообщение
Скрипты исполняются только при старте контейнера, если база пустая.
Да, вы правы, при запуске контейнера postgres пишет:
Code
1
PostgreSQL Database directory appears to contain a database; Skipping initialization
Как будет наиболее правильно очистить базу данных?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
13.10.2020, 19:15
если данные не нужны - можете почистить все внутри volume, ассоциированного с этим контейнером, при следующем запуске контейнера - запустится скрипт инициализации и снова все заполнит.
1
15 / 2 / 1
Регистрация: 18.09.2015
Сообщений: 227
13.10.2020, 19:29  [ТС]
Цитата Сообщение от Jabbson Посмотреть сообщение
если данные не нужны - можете почистить все внутри volume, ассоциированного с этим контейнером, при следующем запуске контейнера - запустится скрипт инициализации и снова все заполнит.
Спасибо за помощь.
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
13.10.2020, 19:31
Всегда пожалуйста!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.10.2020, 19:31
Помогаю со студенческими работами здесь

Python/django/postgre с docker-compose
Добрый день! Прошу подсказать как праивльно поднимать python/django/postgre с докер композ. Хотелось бы уточнить также следует ли...

Docker-compose
Всем привет. Возникла проблема, сделал докеризацию сайта Клиент FROM node:12-alpine as builder WORKDIR /usr/src/app COPY...

Не могу подключиться к контейнеру postgres
В докере разворачиваю базу postgres. Контейнер с ней называется core-postgres. ps&gt; docker contaner inpect core-postgres выдает следующее...

не запускается с docker-compose
Я устанавливаю mongoDB через docker-compose.yml: version: '3' services: mongo: image: mongo restart: always ...

Docker-compose mount
Добрый день возможно кто нибудь сможет мне помочь, задача такая что у меня есть два контайнера fastcgi и smtp и я хочу чтобы в контайнере...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru