You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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脚本的方案

如果有其他自定义逻辑需要通过脚本实现,可以按以下步骤修改:

  1. 先给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
  1. 修改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"]
  1. 删除docker-compose.yml中原来的command配置项,避免和脚本内的启动参数冲突。

注意事项

  • 不要直接把SET语句放在/docker-entrypoint-initdb.d的SQL文件中,该路径下的文件仅在首次初始化数据库时执行一次,容器重启后配置会失效
  • 如果需要开启general_log持久化,可以额外追加启动参数--general-log-file=/var/lib/mysql/mysql.log,日志会存在你挂载的数据卷中不会丢失

内容的提问来源于stack exchange,提问作者mjwrazor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:27:08