无法通过docker compose上的php pdo连接到postgresql
我无法通过PDO将我的php应用程序连接到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的相同配置(相同的主机、相同的端
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放入其中是更好的解决方案。一旦使用硬编码值,就可以这样做。哦,是的!现在你说这太明显了!我觉得自己很愚蠢。。。非常感谢。