【问题标题】:Unable to get PHP working with SQL Server in Docker Container无法让 PHP 在 Docker 容器中与 SQL Server 一起工作
【发布时间】:2021-08-17 21:42:28
【问题描述】:

背景:我对 Docker 非常陌生,并且正在与一个 CodeIgniter 应用程序的团队合作。该项目的当前版本在使用 MySQL 的 Docker 容器中运行,但我们正在探索迁移到 SQL Server。

当我运行 docker build --no-cache . 时,一切似乎都没有错误,我可以使用 HeidiSQL 连接到数据库。

但是,当我在浏览器中打开应用程序时,我得到:

调用未定义函数 sqlsrv_connect()

错误,如果我使用phpinfo() 调出我的测试文件,我在任何地方都看不到sqlsrvpdo_sqlsrv

我在网上做了很多研究,向队友寻求帮助(我们都是 Docker 新手),甚至购买并浏览了教程,但我无法解决问题。任何帮助将不胜感激,因为我觉得我只是忽略了一些明显的东西。

下面是我的docker-compose.yamlDockerfile。在Dockerfile 中,您可以看到我在网上找到的 4 种变体以尝试使其正常工作,但它们都具有相同的结果。

docker-compose.yaml

version: "3.1"
services:
    db_mssql:
        container_name: db_mssql
        image: mcr.microsoft.com/mssql/server:2019-CU12-ubuntu-20.04
        environment:
            ACCEPT_EULA: "Y"
            SA_PASSWORD: "Testing123"
            MSSQL_PID: "Developer"
        ports:
            - '1433:1433'
        volumes: 
            - mssql-volume:/var/opt/mssql

    app-cp-v3:
        build: .
        container_name: app-cp-v3
        ports:
            - 8090:80
        volumes:
            - ./app-cp-v3/:/var/www/html
        networks:
            - default
        working_dir: /var/www/html
        environment:
            XDEBUG_ENABLE: "true"
            XDEBUG_CONFIG: "remote_enable=1 remote_mode=req remote_host=docker.for.mac.localhost remote_port=9004 remote_autostart=1"

volumes:
    mssql-volume:

Dockerfile

FROM php:7.3-apache

ENV ACCEPT_EULA=Y

RUN a2enmod rewrite

RUN sed -ri -e 's!/var/www/html!/var/www/html/public/html!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!/var/www/html/public/html!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

RUN apt-get update && apt-get install -y nano wget gnupg2

RUN docker-php-ext-install bcmath sockets pcntl 

RUN pecl install xdebug-2.9.7
RUN docker-php-ext-enable xdebug \
&& echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.remote_autostart=on" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.remote_port=9001" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.remote_handler=dbgp" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.remote_connect_back=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.idekey=vscode" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.remote_host=docker.for.mac.localhost" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
#RUN echo "xdebug.remote_enable=1" >> /usr/local/etc/php/php.ini

RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - 
RUN curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list 
RUN apt-get update 
RUN ACCEPT_EULA=Y apt-get -y --no-install-recommends install msodbcsql17 unixodbc-dev 
RUN pecl install sqlsrv
RUN pecl install pdo_sqlsrv
RUN docker-php-ext-enable sqlsrv pdo_sqlsrv

# V1
# Install MS ODBC Driver for SQL Server
#ENV ACCEPT_EULA=Y
#RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
#    && curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list \
#    && apt-get update \
#    && ACCEPT_EULA=Y 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/*
#
# END V1

# V2
#
#ENV ACCEPT_EULA=Y
#RUN apt-get update \
#    && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
#    && curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list \
#        > /etc/apt/sources.list.d/mssql-release.list \
#    && apt-get install -y --no-install-recommends \
#        locales \
#        apt-transport-https \
#    && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
#    && locale-gen \
#    && apt-get update \
#    && apt-get -y --no-install-recommends install \
#        unixodbc-dev \
#        msodbcsql17
#
#RUN pecl install sqlsrv pdo_sqlsrv \
#    && docker-php-ext-enable sqlsrv pdo_sqlsrv
#
# END V2

# V3
#
#RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
#
#Download appropriate package for the OS version
#RUN curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
#RUN apt-get update
#RUN ACCEPT_EULA=Y apt-get install -y msodbcsql17
# optional: for unixODBC development headers
#RUN apt-get install -y unixodbc-dev
#
# activate extensions in php.ini
#RUN pecl channel-update pecl.php.net \
#    && pecl install sqlsrv pdo_sqlsrv \
#    && docker-php-ext-enable sqlsrv pdo_sqlsrv
#
# END V3

# V4
#
# Microsoft SQL Server Prerequisites
#RUN apt-get update > /dev/null \
#    && apt-get install -y --no-install-recommends gnupg2 > /dev/null \
#    && apt-get update > /dev/null \
#    && 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 install -y --no-install-recommends \
#        locales \
#        apt-transport-https \
#        > /dev/null \
#    && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
#    && locale-gen > /dev/null \
#    && apt-get update > /dev/null \
#    && apt-get -y --no-install-recommends install \
#        unixodbc-dev \
#        msodbcsql17 \
#        > /dev/null 
#    
# Install & enable Microsoft SQL Server
#RUN docker-php-ext-install pdo > /dev/null \
#    && pecl install sqlsrv pdo_sqlsrv > /dev/null \
#    && docker-php-ext-enable sqlsrv pdo_sqlsrv > /dev/null 
#
#
# END V4

RUN curl -sS https://getcomposer.org/installer -o composer-setup.php
RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer

【问题讨论】:

  • 您确定app-cp-v3 确实在构建吗? Dockerfile 必须以 FROM 指令开头。 REF
  • 看起来我的代码块格式不正确,它没有显示第一行:FROM php:7.3-apache

标签: php sql-server docker docker-compose


【解决方案1】:

您可以尝试运行docker-compose build app-cp-v3 而不是docker build

当您将 docker-compose 与构建指令一起使用时,它会创建一个具有自己名称的 docker 映像(文件夹名称 + 服务的组合)。这意味着如果您使用 docker build 而没有正确的标签 docker-compose 使用“旧”图像。

当您使用docker-compose 时,我的建议是在docker cli 上同时使用docker-compose cli(用于构建、拉取等)以避免此类陷阱。

【讨论】:

    【解决方案2】:

    感谢您的回复。我最终自己解决了这个问题,但问题与 ddegasperi 所建议的完全一样。我正在重新使用旧图像而不是新构建的图像。

    【讨论】:

      猜你喜欢
      • 2016-02-11
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 2015-06-13
      相关资源
      最近更新 更多