簡體   English   中英

無法通過 docker-compose 上的 php pdo 連接到 postgresql

[英]Cannot connect to postgresql via php pdo on docker-compose

我無法通過 PDO 將我的 php 應用程序連接到 postgresql。 我有經典錯誤:

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 命令的連接。

我通過 docker-compose 使用 docker。 這是我的 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

這是我用於 postgresql 的 Dockerfile:

FROM postgres:alpine

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

所以我錯了?

提前致謝。

您的應用程序在容器內運行,當它嘗試連接到 127.0.0.1 時,它希望數據庫服務器在同一個容器中運行。 而事實並非如此。 您的數據庫在容器/服務pgsql

當您在主機上運行您的應用程序時,它可以工作,因為一切都在同一台機器上運行。 您的數據庫客戶端也可以工作,因為您在主機上映射了相同的端口。

解決方案:

將應用程序中對數據庫服務器的引用更改為指向pgsql而不是127.0.0.1 要在主機上也有相同的工作,您也可以將映射添加到 /etc/hosts(或 Windows 的等效項)。 由於您使用環境文件,因此將數據庫 URL 放在其中是一個更好的解決方案。 一旦您使用硬編碼值,您就可以做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM