MySQL Docker 中反向查找主机名的问题

问题描述 投票:0回答:1

我正在尝试配置官方 MySQL docker 容器,它对我所有的微服务都有不同的用户,只有那些微服务可以连接到使用他们的用户。

使用 Docker-compose.yml 中编写的 Docker 服务名称与内置的 MySQL 主机限制功能相结合似乎是合乎逻辑的。

所以我在MySQL中添加了一个用户:

CREATE USER 'user1'@`docker_service_name` IDENTIFIED BY 'my_password';
GRANT SELECT ON `my_database`.'*' to 'user1'@`docker_service_name`;

当我尝试从

docker_service_name
连接时,我收到错误消息:

SQLSTATE[HY000] [1045] Access denied for user 'user1'@'172.19.0.6' (using password: YES) (Connection: mysql, SQL: select * from `table1` where exists (.....)

这当然是真的,允许从任何地方连接的用户不存在(我不希望它存在)。

经过一番研究,我发现了这个问题:How to set up mysql host limitation working with docker container

答案是:

就在这里mysql的官方dockerfile:5.7,在第70行我们可以找到:

#不要反向查找主机名,它们通常是另一个容器 && echo '[mysqld] 跳过主机缓存 跳过名称解析' > /etc/mysql/

我不明白为什么反向名称查找被禁用,因为“它们通常是另一个容器”。为什么是这样?如果我启用它会造成任何伤害吗?

mysql docker user-management
1个回答
0
投票

正如 James Schultz 在评论中指出的那样,MySQL 的公开错误报告

默认启用的原因似乎是:

但为什么默认是这个选项?

  1. Docker 依赖主机 DNS
  2. 容器在创建时使用 /etc/resolv.conf 中配置的 DNS
  3. 如果该 DNS 变得无法访问(例如断开连接、连接到新的 wifi 等),该 DNS 将不再工作 mysql 身份验证滞后,等待客户端主机名解析。

因此,如果您不关心延迟或确定您的 DNS 连接异常良好,那么编辑 MySQL Docker 容器的 my.cnf 似乎是您最好的选择。

你应该删除(或注释掉)行:

skip-name-resolve

要在 Docker 文件中执行此操作,请添加以下内容

CMD sed -i -e "/^skip-name-resolve/d" /etc/my.cnf

如果您使用 docker-compose,您可以将其添加到您的 .yml 中,“mysqld”启动 mysql,以便容器继续运行。

command: sh -c 'sed -i -e "/^skip-name-resolve/d" /etc/my.cnf && mysqld'
© www.soinside.com 2019 - 2024. All rights reserved.