【发布时间】: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