为什么我的 docker-entrypoint-initdb.d 脚本(在 docker-compose.yml 中指定)没有被执行来初始化一个新的 MySQL 实例?

Dar*_*zer 5 mysql init docker docker-compose

/docker-entrypoint-initdb.d这个答案中发现了目录,还阅读了“如何使用这个图像”MySQL 文档的“初始化一个新实例”部分。但是当我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
Run Code Online (Sandbox Code Playgroud)

我确认该./mysql/init目录包含一个名为init.sql. 我确认在清空./mysql/data目录并运行后docker-compose updb创建了一个数据库。但是没有填充数据库,除非我在 Adminer 中手动执行脚本。(我单击“导入”,然后选择文件并按“执行”按钮。)

运行后docker-compose up,我在控制台输出中查找消息,这些消息表明尝试运行init.sql但找不到任何内容。

更新: MySQL 版本为 8.0.19。

Zei*_*tor 9

魔鬼藏在细节里……

您的环境root变量中有双重定义。root用户默认创建,密码来自MYSQL_ROOT_PASSWORD. 然后,您要求创建第二个“普通”用户...使用完全相同的名称和密码(即使用MYSQL_USERMYSQL_PASSWORD

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

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

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

只需拖放MYSQL_USER,并MYSQL_PASSWORD在您的ENV瓦尔,或设置得比不同的用户root,你会立即看到处理您的init文件(不要忘记再次清空你的数据目录)。