【问题标题】:Docker with sqlsrv php73 extension failing to load带有 sqlsrv php73 扩展的 Docker 无法加载
【发布时间】: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:

https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15#debian17

https://docs.microsoft.com/en-us/sql/connect/php/installation-tutorial-linux-mac?view=sql-server-ver15#installing-on-debian

并在不同的 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


【解决方案1】:

所以,我的 Dockerfile 中没有以正确的方式配置多个东西,这是补丁:

FROM php:7.3-apache

# Env variables
ENV ACCEPT_EULA=y

# 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 ODBC Driver
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

# Install sqlsrv
RUN apt-get update
RUN apt-get install -y wget
RUN wget http://ftp.br.debian.org/debian/pool/main/g/glibc/multiarch-support_2.24-11+deb9u4_amd64.deb && \
    dpkg -i multiarch-support_2.24-11+deb9u4_amd64.deb
RUN apt-get -y install msodbcsql17 unixodbc-dev
RUN pecl install sqlsrv pdo_sqlsrv

# Install webapp extension
RUN apt-get update && \
    apt-get install -y \
    git libzip-dev libicu-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

事实上,我必须安装 multiarch-support 的一个原因,尽管它是一个必需的软件包(如果它是一个?),我仍然忽略它。然后,我必须安装我一开始完全忘记的 ODBC 驱动程序。

从现在开始,一切似乎都正常

【讨论】:

  • 很惊讶它仍然在使用packages.microsoft.com/config/debian/9/prod.list。现在有一个 11 的 URL,但它还没有在 docs.microsoft.com 的说明中。
  • 好吧,我没有找到 Debian 11 URL,这就是我尝试使用 9 的原因,我也很惊讶。我试试 11 版本
猜你喜欢
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 2015-04-09
  • 2018-05-27
相关资源
最近更新 更多