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
相关产品推荐
相关产品推荐

