Не удается подключиться к серверу postgres в докере

Я запустил сервер postgresql в докере и выставил порт 5432 sudo docker run -it -p 5432:5432 9c421f1a239c bash и запустил сервер postgres вручную внутри контейнера докеров, но не смог подключиться к нему с помощью команды: psql -h 172.17.0.63 -U venti. 172.17.0.63 - это правильный IP, а venti - мое имя пользователя pg. Но получите ошибку:

psql: could not connect to server: Connection refused
    Is the server running on host "172.17.0.63" and accepting
    TCP/IP connections on port 5432?

Мой pg_hba.conf выглядит так:

local   all             postgres                                peer
host all all 0.0.0.0/0 trust
local all all trust

Подключение к серверу pg внутри контейнера успешно работает.

Dockerfile:

FROM ubuntu:12.04
RUN apt-get update

RUN apt-get install -y gcc libc-dev-bin libc6 libc6-dev libssl-dev libkrb5-dev comerr-dev

RUN apt-get install -y postgresql-common libpq-dev postgresql-9.1-postgis --fix-missing
RUN apt-get install -y postgresql postgresql-client

USER postgres

ENV PGDATA /etc/postgresql/9.1/main
ENV LOGDIR  /etc/postgresql/9.1/main/postgresql.log

WORKDIR /usr/lib/postgresql/9.1/bin
USER root
RUN apt-get install -y vim
USER postgres
RUN sed -e '90d' -i /etc/postgresql/9.1/main/pg_hba.conf
RUN sed -e '91d' -i /etc/postgresql/9.1/main/pg_hba.conf

RUN echo "host all all 0.0.0.0/0 trust" >> '/etc/postgresql/9.1/main/pg_hba.conf'
RUN echo "local all all trust" >> '/etc/postgresql/9.1/main/pg_hba.conf'

RUN ./pg_ctl start && sleep 8 && ./createdb pg && ./createdb bloodstone \
    && createuser -Upostgres -s venti \
    && createdb -Uventi -Oventi venti

# ENTRYPOINT ./pg_ctl start && bash -c "while true; do echo "" > /dev/null; sleep 1; done" 

VOLUME $PGDATA
EXPOSE 5432

Ответ 1

Это едва ли некорректная конфигурация, которую я должен был установить pg для прослушивания открытых адресов или создания сопоставления портов. Я исправил это, отредактировав файл конфигурации pg с помощью sed:

 RUN sed -e "s/[#]\?listen_addresses = .*/listen_addresses = '*'/g" -i '/etc/postgresql/9.1/main/postgresql.conf'

Добавьте это в нужное место в файле Docker, должно быть в порядке.

Ответ 2

Чтобы устранить проблемы с postgres auth в целом, посмотрите на журнал postgres/stderr, чтобы увидеть подробные причины, по которым он не удалось. (Я вижу, что ваша проблема решена, но если кто-то сталкивается с аналогичными проблемами)

Чтобы найти местоположение журнала postgres: "show log_destination;" если у вас есть рабочий psql (например, локально в поле сервера postgres)

Я вижу, что у вас установлено значение "/etc/postgresql/9.1/main/postgresql.log". Вы можете подключиться к контейнеру, чтобы просмотреть журнал с помощью "docker exec -it container_name bash".

Альтернативно, если контейнер запускает postgres напрямую, "docker attach db_container_name" просматривает сообщения postgres stderr.

Обратите внимание, что по умолчанию пользователь postgres не имеет пароля и использует только идентификатор auth.

Ответ 3

Я также столкнулся с подобной проблемой. Попробуйте запустить докер-сбор в два раза.

Причина в том, что в моем файле docker-compose.yml служба БД находилась ниже веб-службы, в которой она пыталась подключиться к БД, который еще не существует.

**

version: '2'  
services:
 nginx:
    image: nginx:latest
    container_name: ng01
    ports:
      - "8000:8000"
    volumes:
      - ./src:/src
      - ./config/nginx:/etc/nginx/conf.d
      - /static:/static  <--- HERE
    depends_on:
      - web  
 web:
    build: .
    container_name: dg01
    command: bash -c "python /src/IMS/manage.py makemigrations && python /src/IMS/manage.py migrate && gunicorn IMS.wsgi -b
0.0.0.0:8000"
    depends_on:
      - db
    volumes:
      - ./src:/src
      - /static:/static 
    expose:
      - "8000"  
 db:
    image: postgres:latest
    container_name: ps01**