You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:42:27