为什么我的 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_USERMYSQL_PASSWORD

如果仔细查看启动日志,您会看到一个错误

db_1       | ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'

这实际上会停止对 docker-entrypoint-initdb.d 中的初始化文件的进一步处理,并继续图像启动过程的其余部分(即在临时服务器上初始化后重新启动 mysql)。

只需将 MYSQL_USERMYSQL_PASSWORD 放入您的环境变量中,或设置与 root 不同的用户,您将立即看到您的初始化文件已处理(不要忘记清空你的数据目录)。