MariaDB容器首次启动时docker-entrypoint-initdb.d脚本未执行问题
以下是针对该问题的具体排查方向:
确认容器首次启动的判定逻辑
官方MariaDB镜像的初始化脚本仅在/var/lib/mysql目录未完成初始化时触发,哪怕目录看似为空,若存在隐藏的初始化标记文件(如.ibdata1、.mysql_secret),也会跳过脚本执行。可进入容器执行ls -la /var/lib/mysql检查目录下所有文件。检查Dockerfile的COPY路径有效性
你使用的COPY /static_dev/docker-entrypoint-initdb.d/* /docker-entrypoint-initdb.d可能存在路径匹配问题:若本地目录有子目录,或路径为绝对路径导致构建上下文不匹配,会造成文件未正确复制。建议在Dockerfile中添加RUN ls /docker-entrypoint-initdb.d -lah,在构建阶段就验证文件是否存在。验证脚本的命名与格式合规性
- SQL文件:必须使用
.sql或.sql.gz后缀,其他后缀无法被识别 - Shell脚本:必须以
#!/bin/bash开头,且后缀为.sh,同时确保文件拥有可执行权限(chmod +x)。检查你的copyDatabases.sh是否满足这两个条件。
- SQL文件:必须使用
查看初始化脚本的详细执行日志
默认容器日志可能未输出初始化脚本的执行细节,可通过以下方式排查:- 启动容器时添加环境变量
MYSQL_DEBUG=1,打印更详细的调试日志 - 执行
docker logs -f <容器名称/ID>,实时查看启动日志中是否有脚本执行的报错信息 - 进入容器查看
/var/log/mysql目录下的日志文件
- 启动容器时添加环境变量
清理Docker构建缓存
即使使用--force-recreate,若Dockerfile的COPY步骤之前的层未变化,构建缓存会复用旧镜像,导致新脚本未被复制。执行docker-compose build --no-cache && docker-compose up --force-recreate,强制重新构建镜像并启动容器。指定MariaDB镜像版本
latest版本的镜像可能存在初始化逻辑的兼容性问题,尝试使用指定稳定版本(如mariadb:10.11),验证是否因版本差异导致脚本不执行。
内容的提问来源于stack exchange,提问作者lawnmower425

