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容器将在启动时首先执行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
这段代码将会运行所有在/docker-entrypoint-initdb.d文件夹下的.sh,.sql,.sql.gz后缀的文件。所以当您发现自己的脚本未被执行时,可能是由于以下原因:
- 脚本文件没有正确地放置在
/docker-entrypoint-initdb.d文件夹下; - 脚本文件的执行权限不正确;
- 脚本文件的后缀名不是
.sh,.sql或.sql.gz;
解决方案
解决这个问题,您需要检查下列几项:
- 检查脚本文件是否正确地放置在
/docker-entrypoint-initdb.d文件夹下:$ ls /path/to/your/docker-entrypoint-initdb.d/folder/ 001-custom-script.sql - 检查脚本文件的执行权限是否正确
$ chmod +x /path/to/your/docker-entrypoint-initdb.d/folder/001-custom-script.sql - 检查脚本文件的后缀名是否正确,只有
.sh,.sql或.sql.gz后缀的脚本才能被执行
如果以上三项都检查过了,而您的脚本仍然无法被执行,请再次确认您的MySQL镜像是否正确,或者尝试重建容器。
总结
在使用Docker部署MySQL时,我们可以使用docker-entrypoint-initdb.d文件夹来提供一些自定义的MySQL脚本来初始化我们的数据库。但是如果您的脚本未能被正确执行,请检查上述三项,尤其是文件的后缀名是否正确。
极客教程