如何通过docker-compose配置PrestaShop数据库服务器及解决环境变量不生效问题?
PrestaShop Docker迁移场景说明
我正在将原有PrestaShop站点迁移至Docker容器环境,目前已在Ubuntu主机上部署了包含PrestaShop、MariaDB、phpMyAdmin的完整容器集群,参考官方Docker仓库的部署说明配置了对应环境变量,当前所用的docker-compose配置如下:
version: "2" services: prestashop: image: prestashop/prestashop networks: mycustomnetwork: ports: - 82:80 links: - mariadb:mariadb depends_on: - mariadb volumes: - ./src:/var/www/html - ./src/modules:/var/www/html/modules - ./src/themes:/var/www/html/themes - ./src/override:/var/www/html/override environment: - PS_DEV_MODE=1 - DB_SERVER=mariadb - DB_USER=user_8 - DB_PASSWD=password_8 - DB_NAME=db_8 - PS_INSTALL_AUTO=0 mariadb: image: mariadb networks: mycustomnetwork: volumes: - db_data:/docker-entrypoint-initdb.d environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=db_8 - MYSQL_USER=user_8 - MYSQL_PASSWORD=password_8 phpmyadmin: image: phpmyadmin/phpmyadmin networks: mycustomnetwork: links: - mariadb:mariadb ports: - 1235:80 depends_on: - mariadb environment: - PMA_HOST=mariadb - PMA_USER=user_8 - PMA_PASSWORD=password_8 volumes: db_data: networks: mycustomnetwork:
当前遇到的故障
- 数据库服务本身运行正常,可通过phpMyAdmin正常连接MariaDB实例
- PrestaShop运行日志抛出连接报错:
Link to database cannot be established: SQLSTATE[HY000] [2002] No such file or directory at line 127 in file classes/db/DbPDO.php - 修改报错位置的测试代码打印连接参数,实际加载的配置值为
localhost user password db,所有参数均来自站点原有app/config/parameters.php文件,完全没有读取docker-compose中传入的环境变量。
解决步骤
按照以下顺序调整配置即可解决配置读取优先级的问题:
- 修正卷挂载的路径冲突
当前配置把宿主机./src目录全量挂载到容器内/var/www/html路径,完全覆盖了官方PrestaShop镜像内置的启动初始化逻辑——镜像本来要在启动时读取环境变量自动生成数据库配置,但被宿主机挂载的旧站点目录直接覆盖,自然无法读取传入的环境变量。如果是迁移已有站点,不需要全量挂载站点根目录,只需要按需挂载自定义的模块、主题、类文件覆盖目录即可,核心框架文件保留镜像内置版本,再适配旧站点的自定义逻辑。 - 调整数据库配置文件的读取逻辑
找到站点路径下app/config/parameters.php文件,删除文件里硬编码的旧数据库连接参数,替换为从系统环境变量读取的格式:
// 替换原有硬编码配置 'parameters' => [ 'database_host' => getenv('DB_SERVER') ?: 'localhost', 'database_user' => getenv('DB_USER') ?: 'default_user', 'database_password' => getenv('DB_PASSWD') ?: 'default_pwd', 'database_name' => getenv('DB_NAME') ?: 'default_db', ]
修改后PrestaShop会优先读取docker-compose传入的环境变量,找不到对应值时才会回退到默认值。
- 修正MariaDB的持久化路径
当前配置把db_data命名卷挂载到了MariaDB容器的/docker-entrypoint-initdb.d路径,这个路径是官方镜像预留的首次启动初始化脚本目录,直接挂载数据卷会覆盖目录下的官方初始化逻辑,同时数据库的实际持久化路径没有被正确挂载,长期运行有数据丢失风险。正确的挂载配置应当将数据卷指向MariaDB的实际数据存储目录:
mariadb: volumes: - db_data:/var/lib/mysql
- 调整自动安装开关的适配逻辑
当前配置的PS_INSTALL_AUTO=0参数,只有在容器检测到/var/www/html路径下没有PrestaShop核心文件时才会生效。因为你挂载了旧的完整站点目录,容器会判定站点已完成安装,不会触发内置的环境变量加载流程。如果是全新部署可以将该值设为1,让容器自动读取环境变量完成初始化;如果是迁移旧站点,按照前面修改parameters.php读取逻辑的方式操作即可。
内容的提问来源于stack exchange,提问作者Wojtek Wencel
相关产品推荐
相关产品推荐

