MySQL容器:授予访问权限并创建新映像

时间:2017-06-19 21:53:35

标签: mysql docker dockerhub

我正在尝试在我的主机系统中使用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?

3 个答案:

答案 0 :(得分:3)

我的原始答案是在MySQL数据初始化后继续更改。但是,由于您希望在图像中为每次初始化自动执行此操作,因此有一种不同的方法。您可以使用以下选项之一:

  1. 此图片有一个名为MYSQL_ROOT_HOST的环境变量,您可以在其中设置主机(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)。您可以在其中创建包含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数据的一部分)。但是一旦你移除了容器,那个卷也会丢失。

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

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

    虽然这些不是保存数据的唯一方法,但它们是两种内置方法。还有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用户的拒绝权限。