Docker容器中Laravel连接PostgreSQL遇SSL要求错误求助
问题描述
我给Laravel项目写了docker-compose文件,包含PostgreSQL、PHP 8、Nginx服务,容器都正常运行。在PHP容器里执行composer install后,运行php artisan migrate时抛出错误:
PDOException SQLSTATE[08006] [7] server does not support SSL, but SSL was required
我的docker-compose.yml文件如下:
version: "3.1" services: webserver: image: nginx:alpine container_name: simplaq-webserver working_dir: /application volumes: - .:/application - ./phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf ports: - "81:80" mysql: image: 'mysql:8.0' container_name: simplaq-mysql working_dir: /application volumes: - '.:/application' environment: - 'MYSQL_ROOT_PASSWORD=xxxxxxxxxx' - MYSQL_DATABASE=xxxx - MYSQL_USER=xxxxx - 'MYSQL_PASSWORD=xxxxxxx' ports: - '44002:3306' postgres: image: 'postgres:14.4' restart: always environment: POSTGRES_DB: 'pppppp' POSTGRES_PASSWORD: 'pppppppp' POSTGRES_USER: 'ppppppp' volumes: - ./phpdocker/postgres-data:/var/lib/postgresql/data - '.:/application' ports: - '5432:5432' php-fpm: build: phpdocker/php-fpm container_name: simplaq-php-fpm working_dir: /application volumes: - .:/application - ./phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/8.0/fpm/conf.d/99-overrides.ini
Laravel的.env文件数据库配置部分:
DB_CONNECTION=pgsql DB_HOST=postgres DB_DATABASE=xxxx DB_USERNAME=xxxx DB_PASSWORD="xxxxx"
问题原因与解决办法
问题出在Laravel默认要求PostgreSQL连接用SSL,但你当前的PostgreSQL容器没开SSL支持。给你两个解决思路:
思路1:直接禁用SSL要求(最简单)
在Laravel的.env数据库配置里加一行,告诉程序不用SSL连接就行:
DB_CONNECTION=pgsql DB_HOST=postgres DB_DATABASE=xxxx DB_USERNAME=xxxx DB_PASSWORD="xxxxx" DB_SSLMODE=disable
加完之后,在PHP容器里重新跑php artisan migrate就好了。
思路2:给PostgreSQL容器开启SSL(适合需要加密的场景)
如果你的项目必须用SSL连接,就修改docker-compose.yml里的postgres服务配置,加上SSL相关的环境变量和证书挂载:
postgres: image: 'postgres:14.4' restart: always environment: POSTGRES_DB: 'pppppp' POSTGRES_PASSWORD: 'pppppppp' POSTGRES_USER: 'ppppppp' POSTGRES_SSL_CERT_FILE: /var/lib/postgresql/data/server.crt POSTGRES_SSL_KEY_FILE: /var/lib/postgresql/data/server.key POSTGRES_SSL_CA_FILE: /var/lib/postgresql/data/root.crt volumes: - ./phpdocker/postgres-data:/var/lib/postgresql/data - ./phpdocker/postgres-ssl:/var/lib/postgresql/data/ssl - '.:/application' ports: - '5432:5432'
注意要提前生成好SSL证书,放到./phpdocker/postgres-ssl目录里,同时更新Laravel的.env配置,填上对应的SSL参数:
DB_SSLMODE=require DB_SSLROOTCERT=/application/phpdocker/postgres-ssl/root.crt DB_SSLCERT=/application/phpdocker/postgres-ssl/client.crt DB_SSLKEY=/application/phpdocker/postgres-ssl/client.key
额外要检查的点
- 你.env里的
DB_DATABASE、DB_USERNAME和docker-compose里postgres服务的POSTGRES_DB、POSTGRES_USER值不匹配(比如postgres的库是pppppp,但.env里是xxxx),这也可能导致连接失败,记得把两边改成一致的。 - 修改.env之后,最好在PHP容器里跑
php artisan config:clear清一下配置缓存,确保新设置生效。
内容的提问来源于stack exchange,提问作者Čamo
相关产品推荐
相关产品推荐

