【问题标题】:User not created in MySQL when using docker-compose使用 docker-compose 时未在 MySQL 中创建用户
【发布时间】:2025-12-22 17:00:07
【问题描述】:

这是我在 docker-compose 创建的容器中看到的:

mysql> SELECT user FROM mysql.user;
+------+
| user |
+------+
| root |
+------+
1 row in set (0.00 sec)

root@541e4d686184:/# echo $MYSQL_USER
dbuser

所以 dbuser 不存在于用户表中,即使 $MYSQL_USER 设置正确。

docker-compose.yml 我有这个:

version: '2'
services:
  db:
    image: mysql:latest
    environment:
      MYSQL_DATABASE: mydb
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: userpass
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306"
    volumes:
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
      - my-datavolume:/var/lib/mysql
volumes:
  my-datavolume:

我希望dbuser 会自动创建,但那没有发生。

我还有一个 sql 文件来创建我的数据库和表(如果它们尚不存在),但现在 tomcat 无法连接到我的数据库。

question 的症状相同,但我已经在使用字典作为我的用户名/密码。

更新:

我越来越近了。当在容器内时,我手动做了:

/docker-entrypoint-initdb.d/create_users.sh 

然后在MySQL 表中创建了用户,我能够将我的应用程序部署到我的tomcat 服务器,并且我没有收到关于dbuser 被拒绝访问的错误。

那么,为什么我必须自己运行这个命令,它应该由 docker-compose 运行,根据 Initializing a fresh instance 下的mysql docker docs

【问题讨论】:

  • 你检查docker logs的输出了吗? mysql日志?您是否考虑过用户权限问题?您是否考虑过使用 mysql 客户端来运行您的 sql 脚本? (例如/usr/bin/mysql < /path/to/script.sql
  • @mlg - 我确实看到它试图创建这个新用户,但 root 用户密码有效。我可以通过 Dockerfile 手动添加用户,如果可能的话,我只是不想这样做。
  • sql 脚本不仅仅适用于创建用户;拥有启动脚本可能最终会是一件好事。您是否预见需要一些额外的启动操作?它可能会让您完全省去处理这个问题。
  • @mig - 不,我没有看到任何其他用途,但目前它以这种方式工作。我可以保存设置数据库的 docker 映像,然后部署它,这样一切都保持正确。我不喜欢这个选项,但它似乎是我最好的选择。
  • 我在这里遇到了同样的问题。它以前工作得很好,现在,这个。我不知道为什么。

标签: mysql docker-compose docker-volume


【解决方案1】:

怎么样:

docker-compose down -v

来自the documentation

-v - 删除在 Compose 文件的卷部分中声明的卷。

您的数据库已在卷中创建,因此您的 docker-compose.yml 中的任何更改都不会反映。

如果您只想删除一个卷,您可以使用docker volume ls 列出所有现有卷,然后使用docker volume rm <VOLUME NAME> 将其删除。

注意: Bind mounts 不会与 -v 标志一起删除,因此如果您使用它们而不是卷,则必须手动删除包含 MySQL 数据的文件夹。

【讨论】:

  • 很好的建议。拯救了我的一天!使用 docker-compose down -v docker-compose up --build 重建镜像
  • 注意:绑定挂载不会使用-v 标志删除,因此您必须手动删除挂载的内容。这让我措手不及的时间比我想承认的要长得多..
  • 经过数小时的努力,我很高兴看到了您的答案!非常感谢。
【解决方案2】:

为我工作:停止 docker 并从以前的版本中手动删除所有包含 MySQL 数据的文件夹

另外:不要忘记添加 MYSQL_DATABASE 环境变量,否则它不会创建您指定的用户。

【讨论】:

    【解决方案3】:

    Github issue

    重要的是要注意图像入口点脚本永远不会 对现有数据库的更改。如果挂载现有数据 目录到 var/lib/mysql,像 MYSQL_ROOT_PASSWORD 这样的选项将 没有效果

    【讨论】:

    • 那么如何挂载卷以进行持久存储?...
    【解决方案4】:

    我遇到了同样的问题,您可以尝试删除“my-datavolume”下的所有内容,因为该环境仅在初始阶段有效,这意味着“/var/lib/mysql”中不应有任何数据。这种方法对我有用。

    【讨论】:

      【解决方案5】:

      对我有用的是:

      docker-compose down
      docker volume ls
      docker volume rm <volume-name>
      docker-compose up -d
      

      在新创建的卷中,我的用户在那里。

      【讨论】:

        【解决方案6】:

        经过我的测试,

        1. 创建 init.sql 并链接到 /docker-entrypoint-initdb.d

        2. docker-compose down
          码头工人卷 ls
          码头工人卷 rm
          docker-compose up -d

        然后一切正常

        【讨论】:

          最近更新 更多