Проверка подлинности пароля для пользователя в образе Docker postgres не удалась - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь докернизировать свой проект Django. Для этого я пытаюсь разделить весь проект на 2 части

  • Все вещи, связанные с сетью, в одном контейнере.
  • База данных, т.е. Postgres в другой

Это мой Dockerfile для первого контейнера.

FROM alpine

# Initialize
RUN mkdir -p /data/web
WORKDIR /data/web
COPY /requirements/* /data/web/

# Setup
RUN apk update
RUN apk upgrade
RUN apk add --update python3 python3-dev postgresql-client postgresql-dev build-base gettext
RUN apk add libffi-dev zlib-dev
RUN apk add build-base python-dev py-pip jpeg-dev
ENV LIBRARY_PATH=/lib:/usr/lib

RUN pip3 install --upgrade pip

RUN pip3 install -r production.txt

RUN pip3 install gunicorn

# Clean
RUN apk del -r python3-dev postgresql

# Prepare
COPY . /data/web/
RUN mkdir -p mydjango/static/admin

RUN chmod u+x docker-entrypoint.sh

# Copy entrypoint script into the image
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

Я создал экземпляр базы данных postgres с помощью команды

docker run --name postgres -it -e POSTGRES_USER=mannu -e POSTGRES_PASSWORD=mysecretpassword postgres

Когда этот экземпляр postgres начал работать, я вошел в экземпляр postgres оболочки usint

docker exec -it postgres /bin/bash
root@ae052fbce400:/# psql -U psql

В открывшейся оболочке Psql я создал базу данных с именем db_name и предоставил все привилегии постгрейзеру с именем mannu;

После выполнения всех вышеописанных процедур я настроил свой файл setting.py так: -

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'itoucan',
        'USER': 'mannu',
        'PASSWORD': 'mysecretpassword',
        'HOST': 'postgres',
        'PORT': 5432
    }
}

Вот мой файл docker-compose.yml

версия: '3'

services:
    web:
        image: 1ce04167758d  #image build of above Dockerfile config
        command: python manage.py runserver
        volumes:
            - .:/code
        ports:
            - "8000:8000"
        depends_on:
            - postgres
    postgres:
        image: postgres
        env_file:
            - .env
        expose:
            - "5432"

Когда я запускаю docker-compose up, я получаю следующую ошибку: -

web_1       | django.db.utils.OperationalError: FATAL:  password authentication failed for user "mannu"

1 Ответ

0 голосов
/ 15 мая 2018

Это потому, что вы создали две службы базы данных.Один вручную через 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...