如何让MySQL Docker容器每次启动时自动执行指定Bash脚本
MySQL Docker容器启动自动执行自定义配置的解决方案
不生效的核心原因
- 官方MySQL镜像的
docker-entrypoint.sh仅在首次初始化数据库时执行/docker-entrypoint-initdb.d下的脚本,后续重启容器不会触发执行 - 你当前改写的ENTRYPOINT逻辑错误:
docker-entrypoint.sh后如果传入的不是mysqld相关启动参数,不会正常启动MySQL主进程,且你的脚本执行时MySQL还未完成启动,无法建立连接执行命令 - 缺少给脚本添加可执行权限的步骤,即使路径正确也无法运行
最优解决方案(无需自定义脚本)
MySQL本身支持启动时直接通过传参开启全局配置,不需要额外写Shell脚本,改一行docker-compose配置即可:
在你的mysql_service的command配置里追加--general-log=1参数即可:
command: --default-authentication-plugin=mysql_native_password --general-log=1
这个方案无需修改Dockerfile,每次容器重启都会自动生效,最适合开发环境使用。
如果你需要保留自定义Shell脚本的方案
如果有其他自定义逻辑需要通过脚本实现,可以按以下步骤修改:
- 先给
set_logging.sh添加等待MySQL启动的逻辑,修改脚本内容如下:
#!/bin/bash set -e # 启动MySQL主进程后台运行 docker-entrypoint.sh --default-authentication-plugin=mysql_native_password & mysql_pid=$! # 等待MySQL启动完成 until mysql -uroot -padmin -e "SELECT 1" > /dev/null 2>&1 do sleep 1 done # 执行自定义配置 mysql -uroot -padmin -e "set global general_log = 1" # 挂载MySQL主进程,避免容器退出 wait $mysql_pid
- 修改Dockerfile配置,添加执行权限,修正ENTRYPOINT逻辑:
FROM mysql:8.0 COPY ./DevOps/Docker/db/set_logging.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/set_logging.sh ENTRYPOINT ["bash", "/usr/local/bin/set_logging.sh"]
- 删除docker-compose.yml中原来的
command配置项,避免和脚本内的启动参数冲突。
注意事项
- 不要直接把SET语句放在
/docker-entrypoint-initdb.d的SQL文件中,该路径下的文件仅在首次初始化数据库时执行一次,容器重启后配置会失效 - 如果需要开启general_log持久化,可以额外追加启动参数
--general-log-file=/var/lib/mysql/mysql.log,日志会存在你挂载的数据卷中不会丢失
内容的提问来源于stack exchange,提问作者mjwrazor
相关产品推荐
相关产品推荐

