【问题标题】:MySQL container: grant access and create a new imageMySQL 容器:授予访问权限并创建新映像
【发布时间】:2017-06-19 21:53:35
【问题描述】:

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

连接到数据库:

mysql -uroot -ppassword

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

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 中?

【问题讨论】:

  • 你试过执行grant all privileges on *.* to root@'%'吗?
  • 啊,是的……对不起……我也这样做了。并刷新特权。我可以从我的主机系统发表评论,但我没有设法通过这些更改将我更新的图像推送到公共 DockerHub。

标签: mysql docker dockerhub


【解决方案1】:

我最初的答案是在 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 文件。

【讨论】:

    【解决方案2】:

    该图像指定了一个默认卷来保存https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/Dockerfile#L11 处的 MySQL 数据。当您启动容器时,会为该容器创建一个卷。当您更新root 用户的权限时,它会保存在此卷中(它实际上是mysql 数据库的MySQL 数据的一部分)。但是一旦您移除容器,该卷也会丢失。

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

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

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

    【讨论】:

    • 但我想要自动化流程。只需使用正确的配置推送图像,然后从另一台主机/计算机拉取对于这个root 用户来说效果很好。您的建议对这种情况有帮助吗?
    • 我将添加另一个答案来专门解决该问题。不清楚您是否想在运行时执行此操作而不是持久化数据。数据永远不应保存在容器分层文件系统中。
    【解决方案3】:
    docker exec -it mysql bash
    chown -R mysql:mysql /var/lib/mysql
    

    如果您更改主机中卷的权限,上述代码将更正 root 权限被拒绝。

    【讨论】:

      猜你喜欢
      • 2016-03-16
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2015-05-24
      相关资源
      最近更新 更多