J'ai démarré un serveur postgresql dans docker et exposé le port 5432 avec Sudo docker run -it -p 5432:5432 9c421f1a239c bash
et le démarrer manuellement à l'intérieur du conteneur docker, mais je ne peux pas me connecter à celui-ci à l'aide de la commande: psql -h 172.17.0.63 -U venti
. 172.17.0.63
est une adresse IP droite et venti est mon nom d'utilisateur pg. Mais obtenez une erreur:
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?
Mon pg_hba.conf ressemble à ceci:
local all postgres peer
Host all all 0.0.0.0/0 trust
local all all trust
La connexion au serveur PG dans le conteneur fonctionne correctement.
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
C'est simplement une mauvaise configuration. J'aurais dû configurer pg pour écouter des adresses publiques ou faire un mappage de port. J'ai corrigé cela en éditant le fichier de configuration pg avec sed:
RUN sed -e "s/[#]\?listen_addresses = .*/listen_addresses = '*'/g" -i '/etc/postgresql/9.1/main/postgresql.conf'
Ajoutez ceci à une place appropriée dans votre fichier Docker, et tout devrait bien se passer.
J'ai également fait face à un problème similaire. Essayez de lancer docker-compose deux fois.
La raison en est que, dans mon fichier docker-compose.yml, le service de base de données était situé sous le service Web dans lequel il essayait de se connecter à une base de données qui n'existe pas encore.
**
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**
Pour résoudre les problèmes d'authentification postgres en général, consultez le journal/stderr de postgres pour connaître les raisons détaillées de son échec. (Je vois que votre problème est résolu, mais si quelqu'un rencontre des problèmes similaires)
Pour trouver l'emplacement du journal postgres: "show log_destination;" si vous avez un psql fonctionnel (par exemple localement sur le serveur postgres)
Je vois que le vôtre est réglé sur "/etc/postgresql/9.1/main/postgresql.log". Vous pouvez vous connecter au conteneur pour afficher le journal à l'aide de "docker exec -it nom_conteneur bash".
Par ailleurs, si un conteneur exécute directement postgres, "docker attach db_container_name" affiche les messages postgres stderr.
Notez que par défaut, l'utilisateur postgres n'a pas de mot de passe et utilise uniquement ident auth.