首页 > 解决方案 > 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

标签: dockerkubernetes

解决方案


标准 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而是在启动时使用该机制。


推荐阅读