我正在尝试在我的主机系统中使用MySQL docker容器,以使安装和配置过程更加轻松和快捷。
所以,我从中提取了一张图片: https://hub.docker.com/r/mysql/mysql-server/
然后根据此图片启动容器..
容器启动正常,但我无法从我的主机系统连接到此数据库(如果我尝试从容器连接,一切正常)。它失败了一条消息:
ERROR 1130 (HY000): Host '<here goes my IP>' is not allowed to connect to this MySQL server
因此,据我所知,我的root
用户没有足够的权限。
我已经进入了我的容器:
docker exec -it mysql bash
连接到DB:
mysql -uroot -ppassword
我的root用户的更新权限:
use mysql;
UPDATE user SET Host="%" WHERE User='root';
它已经更新了。
我决定以某种方式保存更新后的图片......我找到了这个指南:
http://docs.oracle.com/cd/E52668_01/E75728/html/section_c5q_n2z_fp.html
执行后:
docker stop mysql
docker commit -m "Fixed permissions for root user" -a "Few words about author" `docker ps -l -q` myrepo/mysql:v1
docker rm mysql
docker run --name new-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pass -d myrepo/mysql:v1
我发现我的root
用户再次没有权限。
这里有什么问题? 如何将我更新的图像公开到我的Dockerhub?
答案 0 :(得分:3)
我的原始答案是在MySQL数据初始化后继续更改。但是,由于您希望在图像中为每次初始化自动执行此操作,因此有一种不同的方法。您可以使用以下选项之一:
MYSQL_ROOT_HOST
的环境变量,您可以在其中设置主机(https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/docker-entrypoint.sh#L63-L69)。您应该可以将其设置为%
,以允许所有主机以root
连接,例如-e MYSQL_ROOT_HOST="%"
。/docker-entrypoint-initdb.d/
以在启动时初始化(https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/docker-entrypoint.sh#L98-L105)。您可以在其中创建包含UPDATE mysql.user SET Host="%" WHERE User='root';
的SQL文件,然后在您自己的图像中创建ADD
该文件到/docker-entrypoint-initdb.d/
。然后,当基于该映像启动容器时,它将初始化该SQL文件。答案 1 :(得分:1)
该图像指定用于将MySQL数据保存在https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/Dockerfile#L11的默认卷。启动容器时,将为该容器创建一个卷。更新root
用户的权限时,它将保存在此卷中(它实际上是mysql
数据库的MySQL数据的一部分)。但是一旦你移除了容器,那个卷也会丢失。
在这种情况下,通常可以做两件事来保存容器重启或甚至新容器之间的数据:
docker volume create mysqldata
。然后,在启动容器时,使用-v mysqldata:/var/lib/mysql
装入数据。即使您停止或删除MySQL容器,此卷仍将保留。-v /mnt/mysqldata:/var/lib/mysql
等文件夹,而不是创建卷。这将在/mnt/mysqldata
。虽然这些不是保存数据的唯一方法,但它们是两种内置方法。还有Docker卷插件允许您使用其他存储介质(NFS的示例可能为https://github.com/rancher/convoy,NetApp的示例可能为https://github.com/NetApp/netappdvp。)
答案 2 :(得分:1)
docker exec -it mysql bash
chown -R mysql:mysql /var/lib/mysql
如果您更改主机中卷的权限,则以上代码将更正对root用户的拒绝权限。