Debian测试环境Docker部署MariaDB遇ERROR 2002连接错误求助
解决Docker中Debian测试环境无法连接MariaDB的问题
你遇到的ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")错误,核心原因是Docker镜像构建过程中RUN指令的特性导致的——每个RUN都是在独立的临时容器中执行,执行完毕后进程就会终止。你单独用RUN /etc/init.d/mysql start启动的MariaDB服务,在这个RUN执行完成后就停止了,后续执行mysql命令时,服务器根本没在运行,自然找不到socket文件。
除此之外,你的配置还有几个小问题需要修正,下面是完整的解决方案:
1. 修正Dockerfile的构建逻辑
把MariaDB的启动、初始化、授权、导入SQL的步骤合并到同一个RUN指令中,确保这些操作在同一个shell环境下完成,MariaDB服务能保持到初始化操作结束。同时修正SQL文件的路径问题:
FROM debian:testing RUN apt update && apt full-upgrade -y \ && apt install -y --no-install-recommends \ apache2 \ php \ libapache2-mod-php \ mariadb-server \ php-mysql \ openjdk-9-jdk \ git \ && rm -rf /var/lib/apt/lists/* # Copy the database schema to the /tmp directory first ADD ./mgsv.sql /tmp/ # 合并数据库初始化步骤到一个RUN中 RUN service mysql start \ && mysql -e "GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '' WITH GRANT OPTION" \ && mysql < /tmp/mgsv.sql \ && service mysql stop RUN git clone https://github.com/qunfengdong/mGSV.git # 容器启动时启动apache和mysql服务,保持容器前台运行 CMD service apache2 start && service mysql start && tail -f /var/log/apache2/access.log
2. 修正mgsv.sql中的用户拼写错误
你在创建用户时用的是mgsv_user,但授权时写成了mgsvuser,这会导致权限分配失败,修正后的sql文件如下:
CREATE DATABASE mgsv; CREATE USER 'mgsv_user'@'localhost' IDENTIFIED BY 'mgsvpass'; GRANT SELECT, INSERT, CREATE, DROP ON mgsv.* TO 'mgsv_user'@'localhost'; USE mgsv; CREATE TABLE IF NOT EXISTS `userinfo` ( `id` int(10) NOT NULL AUTO_INCREMENT, `email` text NOT NULL, `hash` text NOT NULL, `synfilename` text NOT NULL, `annfilename` text NOT NULL, `url` text NOT NULL, `session_id` text NOT NULL, `annImage` int(5) NOT NULL, `create_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
3. 关键说明
- 合并RUN指令:同一个
RUN里的命令共享同一个进程环境,启动MariaDB后,后续的mysql命令能正常连接,完成初始化后再手动停止服务,避免构建镜像时残留运行进程。 - 容器启动命令:最后添加的
CMD指令会在容器启动时同时启动Apache和MariaDB服务,并用tail -f保持容器前台运行(否则容器会在服务启动后立即退出)。 - SQL文件路径:先执行
ADD指令把sql文件放到/tmp/,再在初始化步骤中使用正确的路径/tmp/mgsv.sql,避免文件找不到的问题。
这样修改后,构建镜像时就能正常完成数据库初始化,容器启动后服务也能正常运行,不会再出现连接socket的错误。
内容的提问来源于stack exchange,提问作者user3523406
相关产品推荐
相关产品推荐

