You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP-FPM无法找到libmsodbcsql-18.1.so.2.1的Docker环境求助

问题描述

使用如下docker-compose.yml构建Docker容器:

version: "3"
services:
  nginx:
    build:
      context: .
      dockerfile: nginx/Dockerfile
    ports: 
      - "8080:80"
    networks:
      - internal
    volumes:
      - ./data/:/var/www/html/
      - ./logs/nginx:/var/log/nginx/
  php:
    build:
      context: .
      dockerfile: php/Dockerfile
    networks:
      - internal
    volumes:
      - ./data/:/var/www/html/
      - ./logs/php.log:/var/log/fpm-php.www.log
networks:
  internal:
    driver: bridge

PHP服务的Dockerfile内容:

FROM php:fpm-alpine

ENV ACCEPT_EULA=Y

# Install prerequisites required for tools and extensions installed later on.
RUN apk add --update bash gnupg less libpng-dev libzip-dev nano nodejs npm openssl su-exec unzip curl nginx supervisor

# Install yarn as global npm package.
RUN npm install -g yarn

# Install prerequisites for the sqlsrv and pdo_sqlsrv PHP extensions.
RUN curl -O https://download.microsoft.com/download/8/6/8/868e5fc4-7bfe-494d-8f9d-115cbcdb52ae/msodbcsql18_18.1.2.1-1_amd64.apk \
    && curl -O https://download.microsoft.com/download/8/6/8/868e5fc4-7bfe-494d-8f9d-115cbcdb52ae/mssql-tools18_18.1.1.1-1_amd64.apk \
    && curl -O https://download.microsoft.com/download/8/6/8/868e5fc4-7bfe-494d-8f9d-115cbcdb52ae/msodbcsql18_18.1.2.1-1_amd64.sig \
    && curl -O https://download.microsoft.com/download/8/6/8/868e5fc4-7bfe-494d-8f9d-115cbcdb52ae/mssql-tools18_18.1.1.1-1_amd64.sig \
    && curl https://packages.microsoft.com/keys/microsoft.asc  | gpg --import - \
    && gpg --verify msodbcsql18_18.1.2.1-1_amd64.sig msodbcsql18_18.1.2.1-1_amd64.apk \
    && gpg --verify mssql-tools18_18.1.1.1-1_amd64.sig mssql-tools18_18.1.1.1-1_amd64.apk \
    && apk add --allow-untrusted msodbcsql18_18.1.2.1-1_amd64.apk mssql-tools18_18.1.1.1-1_amd64.apk \
    && rm *.apk *.sig

# Retrieve the script used to install PHP extensions from the source container.
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/bin/install-php-extensions

# Install required PHP extensions and all their prerequisites available via apt.
RUN chmod uga+x /usr/bin/install-php-extensions \
    && sync \
    && install-php-extensions bcmath ds exif gd intl opcache pcntl pcov pdo_sqlsrv redis sqlsrv zip

# Downloading composer and marking it as executable.
RUN curl -o /usr/local/bin/composer https://getcomposer.org/composer-stable.phar \
    && chmod +x /usr/local/bin/composer

# Setting the work directory.
WORKDIR /var/www/html

执行docker-compose up后容器正常启动,但运行如下PHP SQL查询代码时:

<?php
try {
    $conn = new PDO("sqlsrv:Server=$serverName;Database=$database", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $conn->query("SELECT * FROM MyTable");
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($results as $row) {
        echo "ID: " . $row['id'] . "<br>";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}
?>

抛出错误:

Error: SQLSTATE[01000]: [unixODBC][Driver Manager]Can't open lib '/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.1.so.2.1' : file not found

已通过命令确认文件存在:

81f9341151fb:/# ls -hald /opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.1.so.2.1
-rwxr-xr-x    1 1001     1001        2.0M Oct 26  2022 /opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.1.so.2.1
解决方案

1. 解决Alpine musl与glibc兼容性问题

微软ODBC驱动基于glibc编译,而Alpine默认使用musl libc,二者二进制不兼容,这是核心原因。提供两种解决方式:

方式一:切换到Debian/Ubuntu基础的PHP镜像

将Dockerfile基础镜像替换为Debian系的php:fpm,避免musl兼容性问题:

FROM php:fpm

ENV ACCEPT_EULA=Y

同时调整依赖安装命令,替换apk为apt-get:

# 安装基础依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    bash gnupg less libpng-dev libzip-dev nano nodejs npm openssl su-exec unzip curl nginx supervisor \
    && rm -rf /var/lib/apt/lists/*

微软驱动安装部分替换为Debian官方源安装:

# 安装微软ODBC驱动及工具
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
    && curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql18 mssql-tools18 \
    && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc \
    && rm -rf /var/lib/apt/lists/*

方式二:在Alpine中安装glibc兼容层

若坚持使用Alpine镜像,需安装glibc兼容库,在安装微软驱动前添加以下步骤:

# 安装glibc兼容层
RUN apk add --no-cache ca-certificates wget \
    && wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
    && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r0/glibc-2.35-r0.apk \
    && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r0/glibc-bin-2.35-r0.apk \
    && apk add glibc-2.35-r0.apk glibc-bin-2.35-r0.apk \
    && rm *.apk

2. 配置系统库路径

确保系统能识别微软ODBC的库路径,在Dockerfile中添加:

# 添加微软ODBC库路径到系统配置
RUN echo "/opt/microsoft/msodbcsql18/lib64" >> /etc/ld.so.conf.d/mssql.conf \
    && ldconfig

3. 检查并安装缺失依赖

进入容器执行以下命令,检查驱动库的依赖是否完整:

ldd /opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.1.so.2.1

若输出中存在not found的库(如libssl.so.1.1),在Alpine中安装对应兼容包:

RUN apk add --no-cache openssl1.1-compat

内容的提问来源于stack exchange,提问作者Darrell Brogdon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:54:59