【发布时间】:2021-06-15 10:43:33
【问题描述】:
我正在运行一个基于三个映像构建的 Docker 应用程序:php:7.4-fpm、nginx:stable-alpine 和 postgres:alpine。
我之前尝试使用图像php:7.4-fpm-alpine,但显然它没有附带Postgres PDO 驱动程序,这导致could not find driver 错误。 This post 对此进行了更多解释,以及如何解决它。我按照那篇文章中的步骤操作,包括为我的 PHP FPM 服务创建Dockerfile(尽管我没有创建 PHP CLI 服务),这解决了我的驱动程序问题。但是,当我尝试使用 PDO 连接到我的 PSQL 数据库时,我现在收到以下错误:
SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 6432?
我知道我的数据库正在运行(在端口 6432 上),因为我可以从终端和 Positco 访问它,并且在我的 Docker 应用程序创建后创建了表。我还尝试连接到端口 5432 上的数据库(通过该端口运行我的 Postgres 桌面应用程序),但这也不起作用。我还尝试重新启动我的 Postgres 容器,但没有帮助。
这是我的 PHP:
class Database {
private $connection;
private static $options = array(
PDO::ATTR_EMULATE_PREPARES => FALSE,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
public function __construct() {
try {
$dsn = 'pgsql:host=localhost;port=6432;dbname=db_my_test_app';
$username = 'root';
$password = 'secret';
$connection = new PDO($dsn, $username, $password, self::$options);
$this->connection = $connection;
return $connection;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
}
$database = new Database();
...还有我的docker-compose.yml 文件:
version: '3'
networks:
my_test_app:
services:
# nginx
nginx-service:
image: nginx:stable-alpine
container_name: nginx-container
ports:
- "8080:80"
volumes:
- ./app:/var/www/project
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php-fpm-service
- postgres-service
networks:
- my_test_app
# php
php-fpm-service:
build:
context: .
dockerfile: ./php-fpm/Dockerfile
container_name: php-fpm-container
ports:
- "9000:9000"
working_dir: /var/www/project
volumes:
- ./app:/var/www/project
networks:
- my_test_app
# postgres
postgres-service:
image: postgres:alpine
container_name: postgres-container
ports:
- "6432:5432"
volumes:
- ./postgres:/var/lib/postgresql/data
restart: always
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: secret
POSTGRES_DB: db_my_test_app
networks:
- my_test_app
...和 PHP 服务 Dockerfile(来自上述网站):
FROM php:7.4-fpm
RUN apt-get update && apt-get install -y libpq-dev
RUN docker-php-ext-install pdo pdo_pgsql pgsql
RUN ln -s /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
RUN sed -i -e 's/;extension=pgsql/extension=pgsql/' /usr/local/etc/php/php.ini
RUN sed -i -e 's/;extension=pdo_pgsql/extension=pdo_pgsql/' /usr/local/etc/php/php.ini
【问题讨论】:
-
附注:您可以使用github.com/mlocati/docker-php-extension-installer以更简单的方式安装PHP扩展
标签: php postgresql docker pdo