这是我在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。
答案 0 :(得分:4)
为我工作:停止泊坞窗并手动删除之前版本中包含MySQL数据的所有文件夹。
另外:不要忘记添加MYSQL_DATABASE
环境var,否则它将不会创建您指定的用户。
答案 1 :(得分:2)
怎么样:
docker-compose down -v
-v
-删除在“撰写”文件的“卷”部分中声明的卷。
您的数据库已经在一个卷中创建,因此您的docker-compose.yml
中的任何更改都不会反映出来。
答案 2 :(得分:1)
重要的是,图像入口点脚本永远不会 更改现有数据库。如果挂载现有数据 目录进入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)
经过我的测试,
创建 init.sql 并链接到 /docker-entrypoint-initdb.d
docker-compose down
码头工人卷ls
码头工人卷 rm
docker-compose up -d
然后一切正常