Невозможно подключиться к postgresql через php pdo на docker -создать - PullRequest
0 голосов
/ 19 января 2020

Я не могу подключить свое приложение php через PDO к postgresql. У меня ошибка classi c:

SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432?

Но я могу подключиться к своей базе данных с помощью DBeaver, например, через ту же конфигурацию, которую я использую для PDO (тот же хост, тот же порт, тот же пользователь и тот же пароль! ) и я вижу связь postgresql с netstat commande.

Я использую docker через docker -compose. Это мой docker -compose.yml:

version: '3'

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    depends_on:
      - php
    volumes:
      - "${WWW_DIR}:/usr/share/nginx/html:ro"
      - "${NGINX_LOG}:/var/log/nginx"
      - "${NGINX_DIR}/nginx.conf:/etc/nginx/nginx.conf:ro"
    ports:
      - "127.0.0.1:8000:80"

  php:
    build: ${PHP_DIR}
    container_name: php
    depends_on:
      - pgsql
      - composer
    volumes:
      - "${PHP_LOG}/access.log:/var/log/access.log"
      - "${PHP_LOG}/error.log:/var/log/error.log"
      - "${WWW_DIR}:/var/www/html"
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}

  composer:
    restart: 'no'
    image: composer
    command: install
    volumes:
      - "${WWW_DIR}:/app"

  pgsql:
    restart: always
    build: ${PGSQL_DIR}
    container_name: pgsql
    volumes:
      - "${PGSQL_DIR}/db:/var/lib/postgresql/data"
      - "${PGSQL_LOG}:${POSTGRES_INITDB_WALDIR}:z"
    ports:
      - "127.0.0.1:5432:5432"
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_INITDB_WALDIR=${POSTGRES_INITDB_WALDIR}

Это мой файл .env:

# DIRs
WWW_DIR=../html
PHP_DIR=./php
NGINX_DIR=./nginx
PGSQL_DIR=./pgsql

# LOGs
NGINX_LOG=./nginx/log
PHP_LOG=./php/log
PGSQL_LOG=./pgsql/log
POSTGRES_INITDB_WALDIR=/var/log/pgsql

# DB
POSTGRES_USER=site
POSTGRES_PASSWORD=etis
POSTGRES_DB=dbname

А это мой Dockerfile для postgresql:

FROM postgres:alpine

# DB import
COPY db.sql /docker-entrypoint-initdb.d/

Так в чем я ошибаюсь?

Заранее спасибо.

1 Ответ

0 голосов
/ 19 января 2020

Ваше приложение работает внутри контейнера, и когда оно пытается подключиться к 127.0.0.1, оно ожидает, что сервер базы данных будет работать в том же контейнере. И это не тот случай. Ваша база данных работает в контейнере / сервисе pgsql.

Когда вы запускаете приложение на хосте, оно работает, потому что все работает на одном компьютере. Также ваш клиент базы данных работает, потому что вы сопоставляете тот же порт на хосте.

РЕШЕНИЕ:

Измените ссылку на сервер базы данных в вашем приложении, чтобы указать на pgsql вместо 127.0.0.1. Чтобы иметь такую ​​же работу на хосте, вы также можете добавить отображение в / etc / hosts (или эквивалент для Windows). Поскольку вы используете файл окружения, размещение URL базы данных будет еще лучшим решением. Вы можете сделать это, когда у вас будет работать с жестко закодированным значением.

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