必须挂载/var/lib/mysql,否则容器删除或重启即丢数据;推荐用命名卷或宿主机目录挂载,并确保权限为999:999,配置放/etc/mysql/conf.d/,初始化脚本置于/docker-entrypoint-initdb.d/。

直接用 docker run 启动,但必须挂载 /var/lib/mysql
不挂载数据目录,容器一删,库就全丢——这是新手最常踩的坑。MySQL 容器默认把数据写在 /var/lib/mysql,这个路径必须通过 -v 映射到宿主机真实目录,否则重启或重建容器后,所有表、用户、权限都会消失。
推荐做法是提前创建宿主机目录,并确保权限可写(MySQL 容器内以 UID 999 运行):
mkdir -p ~/docker/mysql/data-
sudo chown -R 999:999 ~/docker/mysql/data(关键!否则容器启动失败报Permission denied) - 启动命令示例:
docker run -d --name mysql8 -e MYSQL_ROOT_PASSWORD=root123 -p 3306:3306 -v ~/docker/mysql/data:/var/lib/mysql -d mysql:8.0
my.cnf 必须放在 /etc/mysql/conf.d/ 才生效
Docker 官方镜像只读取 /etc/mysql/conf.d/ 和 /etc/mysql/mysql.conf.d/ 下的 .cnf 文件。把配置放错位置(比如直接丢进 /etc/mysql/my.cnf)会导致字符集、时区等设置完全被忽略。
常见需求对应的配置项要写对位置:
- 解决中文乱码:
character-set-server=utf8mb4和collation-server=utf8mb4_unicode_ci放在[mysqld]段 - 允许远程连接:
bind-address=0.0.0.0(不是注释掉,是显式设为监听所有地址) - 兼容旧客户端:
default-authentication-plugin=mysql_native_password(MySQL 8.0 默认用caching_sha2_password,Java JDBC 8.0 以下版本连不上)
挂载方式:-v ~/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf
初始化脚本必须放 /docker-entrypoint-initdb.d/ 目录
想让容器首次启动时自动建库、建用户、授权,不能靠 docker exec 手动执行 SQL。官方镜像只在容器第一次初始化数据目录时,扫描并执行 /docker-entrypoint-initdb.d/ 下所有 .sql 或 .sh 文件。
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
注意三个硬性条件:
- 文件必须在容器启动前就存在该路径下(通过
COPY或-v挂载) - 仅对空的
/var/lib/mysql生效——已有数据的目录不会重复执行 - 脚本里不能用
USE hive_metastore这类语句,因为数据库可能还没创建;要用CREATE DATABASE IF NOT EXISTS显式判断
典型 init.sql 示例:CREATE USER IF NOT EXISTS 'hive'@'%' IDENTIFIED WITH mysql_native_password BY 'root123'; GRANT ALL ON hive_metastore.* TO 'hive'@'%'; FLUSH PRIVILEGES;
远程连接失败?重点查 bind-address 和用户 Host
即使端口映射了、防火墙放行了,mysql -h localhost -P 3306 -u root -p 能连,但其他容器或宿主机外机器连不上,大概率是两个配置没配对:
-
bind-address在my.cnf里必须是0.0.0.0,不是127.0.0.1或注释掉 - 用户 Host 必须包含调用方 IP 或通配符:
CREATE USER 'root'@'%' IDENTIFIED BY 'xxx',而不是'root'@'localhost' - MySQL 8.0 默认关闭远程访问,
root用户默认只允许本地连接,必须显式授权:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
验证方法:docker exec -it mysql8 mysql -uroot -proot123 -e "SELECT host,user FROM mysql.user;" —— 确保看到 % 行。
真正麻烦的是权限和挂载路径的组合问题:宿主机目录权限不对、配置文件路径错、init 脚本执行时机不对、用户 Host 写死 localhost……这些点单独看都简单,但串在一起就容易漏一个,导致连上却连不通、建了库却找不到、重启后变空白。建议每次改完配置,先 docker rm -f mysql8 清干净,再重新跑 docker run,避免残留状态干扰判断。

















