【发布时间】:2021-10-20 22:49:14
【问题描述】:
我制作了一个 docker LAMP Stack Container,其中包括 PHP7.3 和一些我需要在其上运行我的 Web 应用程序的扩展。最近我需要包含 sqlsrv 扩展来建立与 MS SQL Server 的连接,它运行良好 1 天,当我重新启动我的 Docker 桌面时,它自行重建,现在即使我尝试删除图像和卷,它也不再工作了容器并重建它。
当我运行 docker-compose up 时出现以下两个错误:
PHP 启动:无法加载动态库“pdo_sqlsrv.so”(已尝试:/usr/local/lib/php/extensions/no-debug-non-zts-20180731/pdo_sqlsrv.so(/usr/local/lib /php/extensions/no-debug-non-zts-20180731/pdo_sqlsrv.so:无法打开共享对象文件:没有这样的文件或目录),/usr/local/lib/php/extensions/no-debug-non-zts -20180731/pdo_sqlsrv.so.so(/usr/local/lib/php/extensions/no-debug-non-zts-20180731/pdo_sqlsrv.so.so:无法打开共享对象文件:没有这样的文件或目录))
PHP 启动:无法加载动态库“sqlsrv.so”(已尝试:/usr/local/lib/php/extensions/no-debug-non-zts-20180731/sqlsrv.so(/usr/local/lib /php/extensions/no-debug-non-zts-20180731/sqlsrv.so:无法打开共享对象文件:没有这样的文件或目录),/usr/local/lib/php/extensions/no-debug-non-zts -20180731/sqlsrv.so.so (/usr/local/lib/php/extensions/no-debug-non-zts-20180731/sqlsrv.so.so: 无法打开共享对象文件: 没有这样的文件或目录))第0行未知
这是我的配置文件:
docker-compose.yml
version: '3.8'
volumes:
datafiles:
services:
mysql:
image: mysql:8.0.0
container_name: mysql8
environment:
- MYSQL_ROOT_PASSWORD=x
- MYSQL_TCP_PORT=x
volumes:
- datafiles:/var/lib/mysql
- "./scripts:/docker-entrypoint-initdb.d"
restart: always
phpmyadmin:
container_name: phpmyadmin
image: phpmyadmin/phpmyadmin:latest
restart: always
environment:
PMA_HOST: x
PMA_USER: x
PMA_PASSWORD: x
ports:
- "8081:80"
website:
container_name: php73
build:
context: .
dockerfile: Dockerfile
image: rootkitty/lamp-quietal-webapp:latest
env_file:
- .env
ports:
- 80:80
- 443:443
depends_on:
- mysql
Dockerfile COPY php.ini 允许添加
extension=sqlsrv.so
extension=pdo_sqlsrv.so
FROM php:7.3-apache
#Install git and MySQL extensions for PHP
ENV ACCEPT_EULA=Y
ENV MYSQL_DBHOST=x
ENV MYSQL_DBPORT=x
ENV MYSQL_DBUSER=x
ENV MYSQL_DBPASS=x
ENV MYSQL_DBNAME=x
# Install selected extensions and other stuff
RUN apt-get update \
&& apt-get -y --no-install-recommends install apt-utils libxml2-dev gnupg apt-transport-https \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
# Install git
RUN apt-get update \
&& apt-get -y install git \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
# 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 \
&& pecl install pdo_sqlsrv \
&& echo "extension=pdo_sqlsrv.so" >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/30-pdo_sqlsrv.ini \
&& echo "extension=sqlsrv.so" >> `php --ini | grep "Scan for additional .ini files" | sed -e "s|.*:\s*||"`/30-sqlsrv.ini \
&& apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
RUN apt-get update && \
apt-get install -y \
git libzip-dev \
&& docker-php-ext-install zip
RUN docker-php-ext-install intl mysqli pdo pdo_mysql
RUN a2enmod rewrite
COPY scripts/php.ini /usr/local/etc/php
COPY www /var/www/html/
EXPOSE 80/tcp
EXPOSE 443/tcp
我按照微软官方文档来制作我的 Dockerfile:
并在不同的 GitHub 页面上收集了一些代码。如何在我的 docker 容器上实现正确的 sqlsrv 安装?
【问题讨论】:
-
仅供参考,LAMP 表示 Linux、Apache、MySQL 和 PHP。如果您已经安装了一个作为 LAMP 的容器,那么它并不是为开箱即用的 SQL Server 而设计的。查看问题中的所有文件,它非常针对 MySQL,不是 SQL Server。
-
是的,我需要 MySQL 和 MS SQL 才能工作,因为我的 Web 应用程序使用两个数据库,一个是 mysql,另一个是 microsoft。我首先安装了 MySQL,现在我尝试在实际安装之外添加 php mssql 我只需要 php sqlsrv 扩展,因为 Microsoft SQL Server 在 Docker 容器之外运行
-
我尝试直接在容器中运行 pecl install sqlsrv-5.9.0 并显示“make”失败。我在另一个线程上读到我需要安装 unixodbc-dev ,我认为我在 Dockerfile 中执行此操作,也许它似乎也因以下错误而失败:
The following packages have unmet dependencies: libodbc1 : PreDepends: multiarch-support but it is not installable odbcinst1debian2 : PreDepends: multiarch-support but it is not installable E: Unable to correct problems, you have held broken packages. -
听起来你有未满足的包依赖关系。你确定
php:7.3-apache使用的是debian9吗?此外,一旦你解决了这个问题,你可能还需要docker-php-ext-enable sqlsrv pdo_sqlsrv。 -
确实,如果你
docker run -it --rm "php:7.3-apache" cat /etc/os-release,它会报告Debian GNU/Linux 11 (bullseye)。
标签: php sql-server docker debian sqlsrv