Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法通过docker compose上的php pdo连接到postgresql_Php_Postgresql_Pdo_Docker Compose - Fatal编程技术网

无法通过docker compose上的php pdo连接到postgresql

无法通过docker compose上的php pdo连接到postgresql,php,postgresql,pdo,docker-compose,Php,Postgresql,Pdo,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的相同配置(相同的主机、相同的端

我无法通过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放入其中是更好的解决方案。一旦使用硬编码值,就可以这样做。

哦,是的!现在你说这太明显了!我觉得自己很愚蠢。。。非常感谢。