为什么我的 docker-入口点-initdb.d 脚本(在 docker-compose.yml 中指定)没有被执行来初始化一个新的 MySQL 实例?
Why isn't my docker-entrypoint-initdb.d script (as specified in docker-compose.yml) executed to initialize a fresh MySQL instance?
我从 , and also read the "Initializing a fresh instance" section of the "How to use this image" MySQL documentation 中找到了 /docker-entrypoint-initdb.d
目录。但是当我 运行 docker-compose up
在下面包含 docker-compose.yml
文件的目录中时,我的数据库没有初始化。
services:
# Use root/root as MySQL user/password credentials
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: root
MYSQL_PASSWORD: root
MYSQL_DATABASE: db
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d/:ro
adminer:
image: adminer
restart: always
ports:
- 8080:8080
我确认 ./mysql/init
目录包含一个名为 init.sql
的文件。我确认在清空 ./mysql/data
目录和 运行 docker-compose up
后,会创建一个 db
数据库。但是数据库没有填充,除非我在 Adminer 中手动执行脚本。 (我点击 "Import",然后选择文件并按下执行按钮。)
我在 运行ning docker-compose up
之后在控制台输出中查找消息,表明尝试 运行 init.sql
但找不到任何内容。
更新: MySQL 版本为 8.0.19.
魔鬼藏在细节中...
您的环境变量中有 root
的双重定义。 root
用户默认使用来自 MYSQL_ROOT_PASSWORD
的密码创建。然后您要求创建第二个 "normal" 用户...具有完全相同的名称和密码(即 MYSQL_USER
和 MYSQL_PASSWORD
)
如果仔细查看启动日志,您会看到一个错误
db_1 | ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'
这实际上会停止对 docker-entrypoint-initdb.d
中的初始化文件的进一步处理,并继续图像启动过程的其余部分(即在临时服务器上初始化后重新启动 mysql)。
只需将 MYSQL_USER
和 MYSQL_PASSWORD
放入您的环境变量中,或设置与 root
不同的用户,您将立即看到您的初始化文件已处理(不要忘记清空你的数据目录)。
我从 /docker-entrypoint-initdb.d
目录。但是当我 运行 docker-compose up
在下面包含 docker-compose.yml
文件的目录中时,我的数据库没有初始化。
services:
# Use root/root as MySQL user/password credentials
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: root
MYSQL_PASSWORD: root
MYSQL_DATABASE: db
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d/:ro
adminer:
image: adminer
restart: always
ports:
- 8080:8080
我确认 ./mysql/init
目录包含一个名为 init.sql
的文件。我确认在清空 ./mysql/data
目录和 运行 docker-compose up
后,会创建一个 db
数据库。但是数据库没有填充,除非我在 Adminer 中手动执行脚本。 (我点击 "Import",然后选择文件并按下执行按钮。)
我在 运行ning docker-compose up
之后在控制台输出中查找消息,表明尝试 运行 init.sql
但找不到任何内容。
更新: MySQL 版本为 8.0.19.
魔鬼藏在细节中...
您的环境变量中有 root
的双重定义。 root
用户默认使用来自 MYSQL_ROOT_PASSWORD
的密码创建。然后您要求创建第二个 "normal" 用户...具有完全相同的名称和密码(即 MYSQL_USER
和 MYSQL_PASSWORD
)
如果仔细查看启动日志,您会看到一个错误
db_1 | ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'
这实际上会停止对 docker-entrypoint-initdb.d
中的初始化文件的进一步处理,并继续图像启动过程的其余部分(即在临时服务器上初始化后重新启动 mysql)。
只需将 MYSQL_USER
和 MYSQL_PASSWORD
放入您的环境变量中,或设置与 root
不同的用户,您将立即看到您的初始化文件已处理(不要忘记清空你的数据目录)。