如何在docker-compose中指定root用户名并自动创建高权限MySQL用户
核心原理说明
官方MySQL镜像支持首次启动时自动执行/docker-entrypoint-initdb.d目录下的SQL脚本,我们可以通过该机制实现权限配置自动化,无需手动进入容器操作。
注意:你原有配置中的
MYSQL_ROOT_USER仅适用于MariaDB镜像,官方MySQL镜像不支持该参数,因此该配置不会生效,原有配置创建的palc用户仅拥有palc数据库的普通权限,无全局超级权限。
方案一:新建独立超级权限用户(更稳妥,不改动默认root账号)
- 在
docker-compose.yml同级目录新建mysql_init文件夹,在文件夹内创建create_superuser.sql文件,内容如下:
-- 自定义超级用户账号密码,可根据需求修改 CREATE USER 'palc_admin'@'%' IDENTIFIED BY '你的自定义强密码'; -- 授予全局所有权限,含授权权限 GRANT ALL PRIVILEGES ON *.* TO 'palc_admin'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
- 修改后的完整
docker-compose.yml配置:
version: '3.8' services: mysql: image: mysql container_name: mysql ports: - '3307:3306' environment: # 默认root账号仅允许容器内本地访问的密码,可自行设置 MYSQL_ROOT_PASSWORD: 'root本地访问密码' MYSQL_DATABASE: 'palc' # 原有普通用户配置,仅拥有palc库权限,不需要可删除 MYSQL_USER: 'palc' MYSQL_PASSWORD: 'palc' volumes: # MySQL数据持久化挂载,对应容器内默认数据目录 - ./mysql_data:/var/lib/mysql # 挂载初始化脚本目录,首次启动自动执行 - ./mysql_init:/docker-entrypoint-initdb.d # 解决MySQL8.0默认密码插件兼容性问题,避免外部连接报错 command: --default-authentication-plugin=mysql_native_password palc: image: palc container_name: palc restart: always build: context: . dockerfile: Dockerfile command: bash -c "python manage.py migrate && python manage.py runserver 0:8000" volumes: - .:/palc ports: - '8000:8000' depends_on: - mysql
方案二:直接开放默认root账号外部访问权限
不需要新建用户,直接修改root账号允许外部访问,在mysql_init目录下的SQL文件写入以下内容即可:
ALTER USER 'root'@'%' IDENTIFIED BY '你要设置的root外部访问密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
注意事项
- 如果之前已经启动过MySQL容器生成了旧数据,需要先删除旧MySQL容器和对应的挂载数据目录(本配置中为
./mysql_data),否则初始化脚本只会在首次启动(数据目录为空)时执行不会生效。 - 生产环境建议不要开放3306端口到公网,超级用户不要使用
%允许任意地址访问,可替换为固定访问IP提升安全性。
内容的提问来源于stack exchange,提问作者Alvaro Lopez
相关产品推荐
相关产品推荐

