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

