15

这是我在 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设置正确,也不会出现在 users 表中。

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 无法连接到我的数据库。

与此问题相同的症状,但我已经在为我的用户名/密码使用字典。

更新:

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

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

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

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

4

6 回答 6

24

怎么样:

docker-compose down -v

文档中

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

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

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

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

于 2019-02-24T09:39:50.857 回答
6

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

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

于 2018-01-26T08:54:59.140 回答
1

Github问题

需要注意的是,图像入口点脚本永远不会对现有数据库进行更改。如果将现有数据目录挂载到 var/lib/mysql 中,则 MYSQL_ROOT_PASSWORD 之类的选项将无效

于 2020-05-27T12:39:55.717 回答
0

对我有用的是:

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

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

于 2020-11-04T05:56:24.010 回答
0

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

于 2020-07-30T01:46:35.623 回答
0

经过我的测试,

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

  2. docker-compose down
    docker volume ls
    docker volume rm
    docker-compose up -d

那么一切都好

于 2021-07-23T09:52:42.417 回答