基于Ubuntu镜像的Dockerfile构建阶段无法连接MySQL报错
问题根源
Docker构建过程中每一条RUN指令都会独立生成一个镜像层,指令执行完成后该层的进程会全部终止,上一层启动的MySQL服务不会留存到下一层,因此执行RUN mysql -u root时找不到运行中的MySQL进程,自然无法连接socket。
同时你的SQL命令写法不符合非交互场景要求,直接将SQL语句写在RUN后会被当成Shell命令执行,无法传入MySQL客户端。
可直接使用的修正后Dockerfile
FROM ubuntu:latest # 关闭debconf交互提示,消除构建警告 ENV DEBIAN_FRONTEND=noninteractive RUN apt update \ && apt-get install mysql-server mysql-client mysql-common libmysqlclient-dev -y \ && usermod -d /var/lib/mysql/ mysql \ # 同层启动MySQL并执行初始化操作,避免进程跨层丢失 && service mysql start \ # 等待MySQL socket文件生成,避免连接时机过早报错 && until [ -S /var/run/mysqld/mysqld.sock ]; do sleep 1; done \ # 使用-e参数非交互式执行SQL语句 && mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password'; FLUSH PRIVILEGES;" # 暴露MySQL默认端口 EXPOSE 3306 # 容器启动时默认运行MySQL服务 CMD ["mysqld_safe"]
改动说明
- 把MySQL安装、权限调整、服务启动、初始化SQL全部合并到同一条
RUN指令中,保证执行SQL时MySQL进程处于运行状态 - 新增socket文件等待逻辑,避免MySQL还未完成启动就尝试连接导致的报错
- 使用
mysql -e参数传递SQL语句,适配Docker构建的非交互式场景 - 新增
DEBIAN_FRONTEND环境变量,消除构建过程中的debconf相关警告
内容的提问来源于stack exchange,提问作者Kalima
相关产品推荐
相关产品推荐

