MySQL – 在docker-entrypoint-initdb中的MySQL脚本未被执行

MySQL – 在docker-entrypoint-initdb中的MySQL脚本未被执行

在使用Docker部署MySQL时,您可能会使用docker-entrypoint-initdb.d文件夹来提供一些自定义的MySQL脚本来初始化您的数据库。但是有时候您会发现这些脚本并没有被成功执行,本文将为您解决这个问题。

阅读更多:MySQL 教程

问题分析

在使用docker-entrypoint-initdb.d文件夹时,我们需要将我们的自定义MySQL脚本放置在该文件夹内。但是有时候即使我们已经正确地放置了脚本,在MySQL容器启动时仍然无法执行它们。

我们需要了解MySQL容器在启动时会执行哪些步骤。使用docker inspect命令查看MySQL容器的元数据,我们可以找到以下的启动选项:

"Entrypoint": [
    "docker-entrypoint.sh"
],
"Cmd": [
    "mysqld"
],
Mysql

这表示MySQL容器将在启动时首先执行docker-entrypoint.sh脚本,然后才会执行MySQL的主进程mysqld。同时,我们也可以在该文件中找到以下代码:

# Load custom defined scripts
echo
for f in /docker-entrypoint-initdb.d/*; do
    case "f" in
        *.sh)     echo "0: running f"; . "f" ;;
        *.sql)    echo "0: runningf"; "{mysql[@]}"<"f"; echo ;;
        *.sql.gz) echo "0: runningf"; gunzip -c "f" | "{mysql[@]}" ; echo ;;
        *)        echo "0: ignoringf" ;;
    esac
    echo
done
Mysql

这段代码将会运行所有在/docker-entrypoint-initdb.d文件夹下的.sh,.sql,.sql.gz后缀的文件。所以当您发现自己的脚本未被执行时,可能是由于以下原因:

  • 脚本文件没有正确地放置在/docker-entrypoint-initdb.d文件夹下;
  • 脚本文件的执行权限不正确;
  • 脚本文件的后缀名不是.sh,.sql.sql.gz

解决方案

解决这个问题,您需要检查下列几项:

  1. 检查脚本文件是否正确地放置在/docker-entrypoint-initdb.d文件夹下:
    $ ls /path/to/your/docker-entrypoint-initdb.d/folder/
    001-custom-script.sql
    Mysql
  2. 检查脚本文件的执行权限是否正确
    $ chmod +x /path/to/your/docker-entrypoint-initdb.d/folder/001-custom-script.sql
    Mysql
  3. 检查脚本文件的后缀名是否正确,只有.sh,.sql.sql.gz后缀的脚本才能被执行

如果以上三项都检查过了,而您的脚本仍然无法被执行,请再次确认您的MySQL镜像是否正确,或者尝试重建容器。

总结

在使用Docker部署MySQL时,我们可以使用docker-entrypoint-initdb.d文件夹来提供一些自定义的MySQL脚本来初始化我们的数据库。但是如果您的脚本未能被正确执行,请检查上述三项,尤其是文件的后缀名是否正确。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册