Docker LAMP容器中PHP7.3的sqlsrv/pdo_sqlsrv扩展加载失败问题求助
解决Docker PHP7.3容器中sqlsrv扩展无法加载的问题
你的核心问题是扩展配置语句中的多余引号,导致PHP尝试加载带引号的文件名(比如"pdo_sqlsrv.so"而不是pdo_sqlsrv.so),同时手动复制php.ini可能覆盖了正确的扩展配置路径。以下是具体的修复方案:
1. 修复Dockerfile中的扩展配置逻辑
官方PHP镜像提供了docker-php-ext-enable工具,能自动处理扩展的配置文件生成,比手动写入ini文件更可靠。修改Dockerfile中安装SQL Server扩展的部分:
# Install MS ODBC Driver for SQL Server RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \ && curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list \ && apt-get update \ && apt-get -y --no-install-recommends install msodbcsql17 unixodbc-dev \ && pecl install sqlsrv pdo_sqlsrv \ && docker-php-ext-enable sqlsrv pdo_sqlsrv \ && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
为什么这样改?
- 去掉了原命令中多余的转义引号(比如
\"extension=pdo_sqlsrv.so\"),原写法会让配置文件里的扩展名称带引号,PHP加载时会寻找不存在的"pdo_sqlsrv.so"文件 - 使用
docker-php-ext-enable自动生成正确的扩展配置,避免手动解析php.ini路径时出错
2. 处理自定义php.ini的冲突
如果你自己的php.ini中已经添加了extension=sqlsrv.so和extension=pdo_sqlsrv.so,请删除这两行——因为docker-php-ext-enable已经自动生成了对应的配置文件,重复配置可能导致加载异常。
如果必须使用自定义php.ini,确保里面的扩展路径正确,或者直接依赖docker-php-ext-enable的配置,不要手动添加扩展加载语句。
3. 修复docker-compose.yml中的语法错误
你的docker-compose.yml里存在多余的引号,可能导致挂载或端口映射异常,修改以下部分:
# 原mysql volumes部分 volumes: - datafiles:/var/lib/mysql - "./scripts:/docker-entrypoint-initdb.d" # 去掉外层的转义引号 # 原phpmyadmin ports部分 ports: - "8081:80" # 去掉外层的转义引号
4. 清理缓存并重新构建
之前的构建缓存可能保留了错误的配置,执行以下命令彻底重建:
# 停止并删除现有容器 docker-compose down # 清理镜像缓存 docker-compose build --no-cache website # 重新启动容器 docker-compose up -d
5. 验证扩展是否加载成功
进入php容器执行命令验证:
docker exec -it php73 php -m | grep sqlsrv
如果输出pdo_sqlsrv和sqlsrv,说明扩展加载成功。
内容的提问来源于stack exchange,提问作者rootKitty




