如何通过Bash脚本向Docker MySQL 5.6容器发送SQL命令并修改密码
在Bash脚本中向MySQL 5.6 Docker容器发送SQL命令(修改root密码)
要在Bash脚本里给MySQL 5.6 Docker容器发送SQL命令修改root密码,核心是利用docker exec在容器内执行非交互式的MySQL命令。我帮你调整并优化脚本,解决可能遇到的坑:
修正后的完整run.sh脚本
#!/bin/bash # 定义初始密码和新密码,请根据实际需求修改 INITIAL_ROOT_PWD="your_initial_password" NEW_ROOT_PWD="your_new_secure_password" # 启动MySQL容器,通过环境变量设置初始root密码 sudo docker run --name=mysql1 -d -e MYSQL_ROOT_PASSWORD="$INITIAL_ROOT_PWD" mysql-5.6 # 等待MySQL服务完全就绪(比固定sleep更可靠) until sudo docker exec mysql1 mysqladmin ping -uroot -p"$INITIAL_ROOT_PWD" --silent; do echo "MySQL服务尚未就绪,等待2秒..." sleep 2 done # 执行SQL命令修改root密码 sudo docker exec mysql1 mysql -uroot -p"$INITIAL_ROOT_PWD" -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('$NEW_ROOT_PWD');" echo "root密码已成功修改为 $NEW_ROOT_PWD"
关键细节说明
设置初始密码的正确方式
官方MySQL 5.6镜像支持通过MYSQL_ROOT_PASSWORD环境变量设置初始root密码,启动容器时加上-e MYSQL_ROOT_PASSWORD="$INITIAL_ROOT_PWD",能确保容器启动后root账号有可登录的初始密码,避免登录失败。等待MySQL服务就绪
容器启动后,MySQL服务需要几秒初始化,直接执行SQL会报错。用mysqladmin ping循环检查是更可靠的方式,直到服务响应再执行修改密码的命令,比固定sleep 10更适配不同性能的机器。非交互式执行SQL
使用mysql命令的-e参数可以直接指定要执行的SQL语句,全程不需要交互输入。注意密码要包裹在双引号里,避免特殊字符(比如!、@)导致解析错误。
你原来脚本的问题分析
- 没有通过环境变量设置初始密码:如果你的Docker镜像没有预设root密码,容器启动后root可能无密码或随机生成密码,导致
mysql -uroot -p$base_password登录失败。 <<<的用法不合适:这种方式是将字符串作为标准输入传给mysql,但mysql在带-p参数且后面直接跟密码时,不需要额外的标准输入传SQL,用-e参数才是脚本化执行SQL的标准方式。
内容的提问来源于stack exchange,提问作者silver wolf
相关产品推荐
相关产品推荐

