Docker Debian容器中MariaDB启动后无法连接的问题求助
大家好,我在构建基于Debian 12的Docker容器时碰到了MariaDB连接的棘手问题:执行到创建数据库用户的步骤时,突然抛出了 ERROR 2002 (HY000): Can't connect to local server through socket '/run/mysqld/mysqld.sock' (111) 的错误。明明已经在之前的RUN指令里启动了mariadb服务,但后续执行mysql命令就是连不上,下面是我的Dockerfile片段和具体报错信息:
问题场景
我的Dockerfile里有这么一段初始化数据库的代码:
RUN service mariadb start RUN mysql -u root -e "CREATE USER 'docker'@'%' IDENTIFIED BY 'docker';" RUN mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'docker'@'%' WITH GRANT OPTION;" RUN mysql -u root -e "FLUSH PRIVILEGES;" RUN service mariadb stop
构建过程中,执行到RUN mysql -u root ...这一步直接报错,提示无法通过socket连接到本地MariaDB服务器。
原因分析
问题的核心在于Docker的RUN指令执行机制:每个RUN指令都是在独立的临时容器中运行的,当这个RUN执行完成后,临时容器会被销毁,里面运行的所有进程(包括刚启动的mariadb服务)都会随之停止。所以当你在第一个RUN里启动mariadb,到下一个RUN执行mysql命令时,mariadb服务早就已经停止了,自然连不上。
解决方案
把mariadb启动、数据库初始化、服务停止这一系列操作放在同一个RUN指令中执行,这样它们会在同一个临时容器环境里完成,确保初始化时mariadb服务处于运行状态。修改后的代码如下:
RUN service mariadb start && sleep 2 && \ mysql -u root -e "CREATE USER 'docker'@'%' IDENTIFIED BY 'docker';" && \ mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'docker'@'%' WITH GRANT OPTION;" && \ mysql -u root -e "FLUSH PRIVILEGES;" && \ service mariadb stop
这里额外加了sleep 2是为了给mariadb服务预留一点启动就绪的时间,避免因为服务还没完全初始化就执行mysql命令导致的连接失败。
额外提示
如果你的数据库初始化逻辑比较复杂,也可以把这些操作写成一个单独的shell脚本,然后在同一个RUN里调用脚本执行;或者使用ENTRYPOINT脚本在容器启动时完成初始化(这种方式需要添加判断逻辑,避免每次容器启动都重复执行初始化操作)。
备注:内容来源于stack exchange,提问作者raymater

