docker - Docker 容器 (Kubernetes):Mysql 用户访问被拒绝
问题描述
嗨,我已经遵循了一些关于如何开始设置本地 db + WordPress 安装的 k8s 教程,但用户无法连接到我的集群中的 mysql。(其他一切似乎都不错 - 在 Kubernetes Dashboard Web UI 中)
错误:[15:40:55][~]#kubectl logs -f website-56677747c7-c7lb6 [21-Nov-2019 11:07:17 UTC] PHP 警告:mysqli::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known in Standard input code on line 22 [21-Nov-2019 11:07:17 UTC] PHP Warning: mysqli::__construct(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name or service not在第 22 行的标准输入代码中已知
MySQL 连接错误:(2002) php_network_getaddresses: getaddrinfo failed: Name or service not known [21-Nov-2019 11:07:20 UTC] PHP Warning: mysqli::__construct(): (HY000/1045): Access denied for user第 22 行标准输入代码中的“websiteu5er”@“10.1.0.35”(使用密码:YES)
MySQL 连接错误:(1045)用户'websiteu5er'@'10.1.0.35'的访问被拒绝(使用密码:是)
MySQL 连接错误:(1045)用户'websiteu5er'@'10.1.0.35'的访问被拒绝(使用密码:是)
MySQL 连接错误:(1045)用户'websiteu5er'@'10.1.0.35'的访问被拒绝(使用密码:是)
我的 Dockerfile(我用来创建推送到 docker hub 然后拉入 k8s 服务 + 部署的镜像):
FROM mysql:5.7
# This should create the following default root + user?
ENV MYSQL_ROOT_PASSWORD=hello123
ENV MYSQL_DATABASE=website
ENV MYSQL_USER=websiteu5er
ENV MYSQL_PASSWORD=hello123
RUN /etc/init.d/mysql start \
&& mysql -u root --password='hello123' -e "GRANT ALL PRIVILEGES ON *.* TO 'websiteu5er'@'%' IDENTIFIED BY 'hello123';"
FROM wordpress:5.2.4-php7.3-apache
# Copy wp-config file over
COPY configs/wp-config.php .
RUN chown -R www-data:www-data *
COPY ./src/wp-content/themes/bam /var/www/html/wp-content/themes/bam
解决方案
标准 Docker Hub mysql映像仅在数据库第一次启动时才能够运行任意 SQL 脚本。它还可以使用已知密码设置初始数据库用户,仅在第一次启动时再次设置。详细信息在链接的 Docker Hub 页面中。
在 Kubernetes 上下文中,我只使用环境变量,并在我的 pod 规范中指定它们。
containers:
- name: mysql
image: mysql:5.7 # not a custom image
env:
- name: MYSQL_USER
value: websiteu5er
- name: MYSQL_PASSWORD
value: hello123
如果您确实需要更多相关设置,我会创建一个包含 SQL 脚本的 ConfigMap,然后将其挂载到/docker-entrypoint-initdb.d
.
您的 Dockerfile 中发生了两件事。一个是,当你有多行时FROM
,你实际上是在执行一个多阶段构建;最后得到的图像只是 Wordpress 图像,以及跳过它之前的 MySQL 部分。第二个是您实际上无法创建FROM mysql
包含任何数据库级配置或内容的图像,因此第一阶段产生的图像已设置环境变量但实际上不会执行您的GRANT PRIVILEGES
语句。
我只是删除最后FROM
一行之前的所有内容,而不是尝试构建派生的 MySQL 映像;/docker-entrypoint-initdb.d
而是在启动时使用该机制。
推荐阅读
- java - 在 IntelliJ 上生成 JAR
- asp.net-mvc - Control + F5 对某些图像随机给出 403 禁止错误
- azure-active-directory - 是否有 Graph API 可以通过 AD B2C 获取所有登录活动?
- xml - 在一行中使用 DFDL 解析输入
- jenkins - SecureGroovyScript.script 期望类 java.lang.String 但收到 SecureGroovyScript
- python-3.x - 随机森林算法中随机状态参数的重要性是什么?
- python - 如何在 Keras 中训练网络时在 GPU 上解码图像?
- oauth - 为什么 Google 为 OAuth 生成的客户端 ID 看起来像 uris?
- python - 从数据框列比较中返回多条记录
- c# - C#如何从其他服务获取对公共服务字段或方法的访问权限?