使用docker-compose时,未在用户表中创建mysql_user

时间:2016-12-31 06:19:26

标签: mysql docker-compose

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

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

mysql> exit
Bye
root@541e4d686184:/# echo $MYSQL_USER
dbuser
用户表中不存在

dbuser

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
  web:
#    build: .  # Look in the current directory for a Dockerfile and build images using it
    image: me/tomcat:v1
    depends_on:    # Link web container to db container
      - db
    environment:  # Set up environment variables
      MYSQL_DATABASE: mydb
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "8080:8080"  # Forwards the exposed port 8080 on the container to port 8080 on the host machine
volumes:
  my-datavolume:

我希望自动创建dbuser,但这并没有发生。

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

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

更新

我越来越近了。如果我这样做:

docker-compose exec db /bin/bash

然后做:

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

然后,当我这样做时,我看到:

mysql> SHOW GRANTS for dbuser;
+---------------------------------------------+
| Grants for dbuser@%                         |
+---------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'%' |
+---------------------------------------------+

然后我能够将我的应用程序部署到我的tomcat服务器,并且我没有得到关于dbuser被拒绝访问的错误。

那么,为什么我必须自己运行此命令,它应该由docker-compose运行,根据初始化新实例下的mysql docker docs

6 个答案:

答案 0 :(得分:4)

为我工作:停止泊坞窗并手动删除之前版本中包含MySQL数据的所有文件夹

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

答案 1 :(得分:2)

怎么样:

docker-compose down -v

来自the documentation

  

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

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

答案 2 :(得分:1)

Github issue

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

对我有用的是:

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

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

答案 5 :(得分:0)

经过我的测试,

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

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

然后一切正常