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

Alpine 3.13下Apache加载apr_dbd_mysql.so提示my_init符号缺失求助

Apache启动报错:my_init符号未找到问题排查与解决

问题背景

我正在使用Docker为PHP网站构建镜像,基础镜像是phpswoole/swoole:4.8-php7.3-alpine(对应Alpine 3.13)。

安装Apache2及依赖的命令:

apk add --no-cache apache2 php7-apache2 apr-util-dbd_mysql apache2-http2 apache2-proxy apache2-ssl apache2-utils

启动Apache2时出现以下错误:

* apache2 has detected an error in your setup:
httpd: Syntax error on line 169 of /etc/apache2/httpd.conf: Cannot load modules/apr_dbd_mysql.so into server: Error relocating /var/www/modules/apr_dbd_mysql.so: my_init: symbol not found
 * ERROR: apache2 failed to start

在Ubuntu环境中,我可通过安装libaprutil1-dbd-mysql生成apr_dbd_mysql.so,但Alpine 3.13中仅能找到apr-util-dbd_mysql包。另外,MySQL服务器部署在另一Docker容器,当前镜像未安装MySQL服务器。

请问如何解决该Apache问题?有没有办法让my_init符号可用,或者Alpine 3.13的apr-util-dbd_mysql包是否有相关补丁?


更新内容

Dockerfile完整内容

# syntax=docker/dockerfile:experimental
FROM phpswoole/swoole:4.8-php7.3-alpine AS base

# Add repos
#RUN echo "https://dl-cdn.alpinelinux.org/alpine/v3.15/main" >> /etc/apk/repositories
#RUN echo "https://dl-cdn.alpinelinux.org/alpine/v3.15/cummunity" >> /etc/apk/repositories

# Install apache & nginx (nginx is used as live stream server)
RUN set -ex \
    && apk update && apk upgrade \
    && apk add --no-cache openrc git \
    && apk add --no-cache $PHPIZE_DEPS bzip2-dev gettext-dev icu-dev gettext-dev gmp-dev libxslt-dev libxml2-dev freetype-dev libpng-dev libjpeg-turbo-dev libgcrypt-dev libsodium-dev musl-dev libzip-dev libexif-dev tidyhtml-dev pcre-dev openssl apr-dev apr-util-dev build-base \
    && docker-php-ext-configure gd --with-freetype-dir=/usr --with-png-dir=/usr --with-jpeg-dir=/usr \
    && docker-php-ext-install bcmath bz2 calendar exif gd gettext gmp intl mysqli pcntl shmop soap sysvmsg sysvsem sysvshm tidy xmlrpc xsl zip opcache \
    && docker-php-ext-enable bcmath bz2 calendar exif gd gettext gmp intl mysqli pcntl shmop soap sysvmsg sysvsem sysvshm tidy xmlrpc xsl zip opcache \
    && apk add --no-cache apache2 php7-apache2 apr-util-dbd_mysql apache2-http2 apache2-proxy apache2-ssl apache2-utils \
    # enable apache modules
    && ln -s /usr/lib/apr-util-1/apr_dbd_mysql.so /usr/lib/apache2/apr_dbd_mysql.so \
    && sed -i 's@^LoadModule negotiation_module modules/mod_negotiation\.so@LoadModule apr_dbd_mysql modules/apr_dbd_mysql.so@' /etc/apache2/httpd.conf \
    # (ignore other apache2 modules)

# apache port 80 (nginx uses other ports)
EXPOSE 80

FROM base AS dev
RUN --mount=type=bind,target=localhost/htdocs,source=./src,rw
COPY apache-dev.conf /etc/apache2/conf.d/website.conf
CMD /usr/sbin/httpd -D FOREGROUND

docker-compose.yml完整内容

services:
  website:
    build: 
      context: .
      dockerfile: Dockerfile
      target: dev
    external_links:
      - mysql
    networks:
      - website-network

networks:
  website-network:

解决方案

核心原因

my_init是MySQL客户端库的符号,apr_dbd_mysql.so依赖该符号,但你的镜像缺少对应的MySQL客户端依赖包——Alpine的apr-util-dbd_mysql不会自动安装该依赖,导致动态链接失败。

方法一:安装MySQL客户端库

在apk add命令中加入mariadb-connector-c(Alpine官方的MySQL客户端替代包),它包含所需的符号:
修改Dockerfile中的安装命令行:

&& apk add --no-cache apache2 php7-apache2 apr-util-dbd_mysql apache2-http2 apache2-proxy apache2-ssl apache2-utils mariadb-connector-c \

如果Apache依然找不到库,可添加软链接或设置环境变量:

# 添加软链接
&& ln -s /usr/lib/mariadb/libmariadb.so.3 /usr/lib/libmariadb.so.3 \

或者修改启动命令:

CMD export LD_LIBRARY_PATH=/usr/lib/mariadb:$LD_LIBRARY_PATH && /usr/sbin/httpd -D FOREGROUND

方法二:移除不必要的模块加载

如果你根本没用到Apache的DBD MySQL功能,直接注释掉加载apr_dbd_mysql的那行代码即可:

# && sed -i 's@^LoadModule negotiation_module modules/mod_negotiation\.so@LoadModule apr_dbd_mysql modules/apr_dbd_mysql.so@' /etc/apache2/httpd.conf \

验证

构建镜像并启动容器,查看日志确认Apache正常运行:

docker-compose up -d
docker logs website

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:10:06