我正在尝试配置官方 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/
我不明白为什么反向名称查找被禁用,因为“它们通常是另一个容器”。为什么是这样?如果我启用它会造成任何伤害吗?
正如 James Schultz 在评论中指出的那样,MySQL 的公开错误报告。
默认启用的原因似乎是:
但为什么默认是这个选项?
- Docker 依赖主机 DNS
- 容器在创建时使用 /etc/resolv.conf 中配置的 DNS
- 如果该 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'