【问题标题】:Why isn't my docker-entrypoint-initdb.d script (as specified in docker-compose.yml) executed to initialize a fresh MySQL instance?为什么我的 docker-entrypoint-initdb.d 脚本(在 docker-compose.yml 中指定)没有被执行来初始化一个新的 MySQL 实例?
【发布时间】:2020-05-18 03:35:00
【问题描述】:

我从this answer 中发现了/docker-entrypoint-initdb.d 目录,还阅读了"How to use this image" MySQL documentation 的“初始化新实例”部分。但是当我在包含下面docker-compose.yml 文件的目录中运行docker-compose up 时,我的数据库没有初始化。


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中手动执行脚本。 (我点击“导入”,然后选择文件并按“执行”按钮。)

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

更新: MySQL 版本为 8.0.19。

【问题讨论】:

    标签: mysql docker docker-compose init


    【解决方案1】:

    魔鬼藏在细节里……

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

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

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

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

    只需将MYSQL_USERMYSQL_PASSWORD 放到你的环境变量中,或者设置一个不同于root 的用户,你就会立即看到你的初始化文件得到处理(不要忘记再次清空你的数据目录)。

    【讨论】:

    • 非常感谢您的回答!我花了 2 天时间寻找这个问题的答案,并在很多论坛中阅读了所有可能的答案。就是这样!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多