2015-06-11 45 views
10

Uruchomiłem serwer postgresql w oknie dokowanym i odsłoniłem port 5432 przez sudo docker run -it -p 5432:5432 9c421f1a239c bash i ręcznie uruchomiłem serwer postgres w kontenerze dokowania, ale nie mogę połączyć się z nim za pomocą komendy: psql -h 172.17.0.63 -U venti. 172.17.0.63 to właściwy adres IP, a venti to moja nazwa użytkownika pg. Ale się błąd:Nie można połączyć się z serwerem postgres w docker

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? 

Moja pg_hba.conf wygląda następująco:

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

Łączenie z serwerem pg wewnątrz pojemnika działa skutecznie.

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 
+0

brakuje (parametr -p portu przed 5432: 5432) w poleceniu, jeśli to nie jest literówka –

+0

@ChandanNayak Niestety, to tylko literówka ... – kxxoling

+0

Czy na telefonie kontener nadal działa po wyjściu z uruchomionego kontenera? Ponieważ nie uruchamiasz go z parametrem -d –

Odpowiedz

3

To ledwo błąd w konfiguracji, co powinienem ustawić str wysłuchać adresów publicznych lub złożyć mapowanie portów. Naprawiłem to, edytując plik konfiguracyjny pg za pomocą sed:

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

Dodaj to do właściwego miejsca w pliku Dockerfile powinno być OK.

0

Aby ogólnie rozwiązywać problemy z uwierzytelnianiem postgresem, spójrz na dziennik/stderr postgreSQL, aby zobaczyć szczegółowe przyczyny niepowodzenia. (Widzę, że twój problem został rozwiązany, ale jeśli ktoś ma podobne problemy)

Aby znaleźć lokalizację dziennika postgres: "show log_destination;" jeśli masz działający psql (np. lokalnie na skrzynce serwera Postgres)

Widzę twoja jest ustawiona na "/etc/postgresql/9.1/main/postgresql.log". Możesz połączyć się z kontenerem, aby zobaczyć dziennik za pomocą "docker exec -it nazwa_backi nazwa_bash".

Alternatywnie, jeśli kontener uruchamia bezpośrednio postgres, "docker attach db_container_name" wyświetla komunikaty postgres stderr.

Należy pamiętać, że domyślnie użytkownik postgres nie ma hasła i używa tylko identyfikatora auth.

0

Mam również do czynienia z podobnym problemem. Spróbuj uruchomić dwukrotnie funkcję dokowania.

Powód jest taki, że w moim pliku docker-compose.yml usługa DB znajdowała się poniżej usługi sieci Web, w której próbowała się połączyć z bazą danych, która jeszcze nie istnieje.

**

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** 
+1

To nie powinno się dziać, jeśli masz "zależy" – guival

Powiązane problemy