当前位置: 首页 > 知识库问答 >
问题:

为什么我的docker入口点不是initdb。是否执行d脚本(如docker compose.yml中指定的)来初始化新的MySQL实例?

裴俊迈
2023-03-14

我发现了docker入口点initdb。请参阅MySQL文档“如何使用此映像”中的“初始化新实例”部分。但当我在包含docker compose的目录中运行docker compose up时。下面的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中手动执行脚本。(我单击“导入”,然后选择文件并按执行按钮。)

在运行docker compose up之后,我在控制台输出中查找指示尝试运行初始化的消息。sql,找不到任何内容。

更新:MySQL版本为8.0.19。

共有1个答案

晏富
2023-03-14

魔鬼隐藏在细节中...

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

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

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

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

只需在env vars中删除MYSQL\u USER和MYSQL\u PASSWORD,或者设置一个不同于root的用户,您就会立即看到init文件被处理(不要忘记再次清空数据目录)。

 类似资料:
  • 我试图让我的docker db容器在创建时自动用数据集填充数据库。根据mariadb留档,卷中有一个文件夹可用于此目的。 我设置了我的文件来镜像我在StackOverflow上找到的示例,但是仍然无法执行我的SQL脚本。以下是我的文件的相关部分: 在文件,我有一个文件: 在每次测试迭代之前,我会清理所有旧的/缓存的Docker内容: 我发现这实际上并没有删除数据库卷。运行仍会显示过去存在的卷 Do

  • 问题内容: 我正在尝试在MySQL容器启动时创建多个数据库。根据https://github.com/docker- library/mysql/pull/18 ,我可以在映像的中装载或复制脚本,它们将在启动时自动执行。 但是我的脚本根本没有执行。好像在目录中看不到文件。 这是我的Dockerfile: 这是我的: 我构建并运行容器: 当我在tty中访问容器时,可以看到处于,但未执行。 我看到了输

  • 问题内容: 我希望服务器每分钟执行一次节点脚本。如果我手动执行文件(),该程序将完美执行,因此,我很确定这不是问题。但是,当我将其交给cron执行时,什么也没发生。 这是cron文件中的行。 这是一个示例日志: 可执行文件: 知道我为什么要广播静音吗?我应该在其他地方调试? 更新: 我相信问题与我的相对文件路径有关,并且main.js从其自己的目录外部执行。 所以现在,我已经放置在目录中。看起来像

  • 根据此堆栈溢出问题的公认(且唯一)答案, 使用 将改为零初始化对象。 那么,为什么呢?, 生成此输出: 定义的两个构造函数都是默认的?正当对于POD类型,默认初始化为零初始化。 根据这个问题的公认答案, 如果POD成员未在构造函数中初始化,也未在类初始化中通过C11初始化,则默认为已初始化。 不管是堆栈还是堆,答案都是一样的。 在C 98中(而不是之后),new int()被指定为执行零初始化。

  • 如果我有: 很明显,这个表达式后面的应该是零,但我看到的任何地方,他们都说这个代码的行为是未定义的,而不仅仅是的值(直到减法之前)。 很明显,编译器可以简单地在变量中使用它认为“方便”的任何垃圾值,并且它将按照预期工作。这种方法有什么问题?

  • 问题内容: ava中的Double Brace初始化语法()是什么? 问题答案: 双括号初始化将创建一个从指定类(外部括号)派生的匿名类,并在该类(内部括号)内提供一个初始化程序块。例如 请注意,使用这种双重括号初始化的作用是创建匿名内部类。创建的类具有this指向周围外部类的隐式指针。尽管通常不是问题,但在某些情况下(例如序列化或垃圾收集时)可能会引起悲伤,值得一提的是。