MySQL容器:授予访问权限并创build一个新的映像

我正在尝试在我的主机系统中使用MySQL docker容器,使安装和configuration过程变得更加简单快捷。

所以,我已经从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用户没有足够的权限。

我input了我的容器:

 docker exec -it mysql bash 

连接到DB:

 mysql -uroot -ppassword 

更新了我的root用户的权限:

 use mysql; UPDATE user SET Host="%" WHERE User='root'; 

它的更新很好。

比我决定保存我更新的图像莫名其妙…我find了这个指南:

 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?

该映像在https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/Dockerfile#L11中指定了保留MySQL数据的默认卷&#x3002; 当您启动容器时,将为该容器创build一个卷。 当你更新root用户的权限时,它被保存在这个卷中(它实际上是mysql数据库的MySQL数据的一部分)。 但是,一旦你删除了容器,该卷也丢失了。

在这种情况下,通常有两件事可以保留容器重启之间的数据甚至是新的容器:

  1. 创build一个命名卷并在那里安装数据。 要做到这一点,你可以运行docker volume create mysqldata 。 然后,启动容器的时候用-v mysqldata:/var/lib/mysql装入数据。 即使您停止或删除您的MySQL容器,该卷仍将保留。
  2. 将数据绑定到主机文件夹。 您可以只装载一个文件夹(如-v /mnt/mysqldata:/var/lib/mysql ,而不是创build卷。 这会将所有的MySQL数据保存在/mnt/mysqldata主机上。

虽然这些不是坚持数据的唯一方法,但它们是两种内置的方法。 还有Docker卷插件允许您使用其他存储介质(例如,NFS的https://github.com/rancher/convoy和NetApp的https://github.com/NetApp/netappdvp )。

我的原始答案是在MySQL数据初始化后保持更改。 但是既然你想在图像中为每个初始化自动执行此操作,那么就有一个不同的方法。 您可以使用以下选项之一:

  1. 有一个名为MYSQL_ROOT_HOST的环境variables,可以设置主机( https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/docker-entrypoint.sh#L63-L69 )。 您应该可以将其设置为%以允许所有主机以root身份进行连接,例如-e MYSQL_ROOT_HOST="%"
  2. 该映像支持将SQL文件添加到/docker-entrypoint-initdb.d/以在启动时进行初始化( https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/docker-entrypoint.sh# L98-L105 )。 你可以创build你的SQL文件有UPDATE mysql.user SET Host="%" WHERE User='root'; 然后将该文件添加到您自己映像中的/docker-entrypoint-initdb.d/ 。 然后,当启动一个基于该映像的容器时,它将初始化该SQL文件。