Docker容器(Kubernetes):拒绝MySQL用户访问

时间:2019-11-21 13:58:26

标签: docker kubernetes

嗨,我已经按照k8s的一些教程进行了设置本地db + WordPress安装的操作,但是用户无法连接到集群中的mysql。 (一切似乎都可以-在Kubernetes Dashboard Web UI中)

  

错误:[15:40:55] [〜] #kubectl日志-f网站-56677747c7-c7lb6   [2019年11月21日   11:07:17 UTC] PHP警告:mysqli :: __ construct():   php_network_getaddresses:getaddrinfo失败:名称或服务不正确   在第22行的标准输入代码中已知的[21-Nov-2019 11:07:17 UTC] PHP   警告:mysqli :: __ construct():(HY000 / 2002):   php_network_getaddresses:getaddrinfo失败:名称或服务不正确   在第22行的标准输入代码中已知

     

MySQL连接错误:(2002年)php_network_getaddresses:getaddrinfo   失败:名称或服务未知[21-Nov-2019 11:07:20 UTC] PHP   警告:mysqli :: __ construct():(HY000 / 1045):拒绝用户访问   标准输入代码中的“ websiteu5er” @“ 10.1.0.35”(使用密码:是)   在第22行

     

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

2 个答案:

答案 0 :(得分:1)

标准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机制。

答案 1 :(得分:0)

我看到您正在尝试启动mysql数据库,然后为您的用户授予特权,但是您做错了所有事情。

运行后:

RUN /etc/init.d/mysql start \
    && mysql -u root --password='hello123' -e "GRANT ALL PRIVILEGES ON *.* TO 'websiteu5er'@'%' IDENTIFIED BY 'hello123';"

mysql启动,但是&&之后的查询永远不会运行,因此您的用户无法获得其特权。仅当mysql成功退出时,它才会运行。 查看here来解释&&在shell中的工作原理。

您要执行的操作是在mysql启动后运行此命令,您可以通过多种方式执行此命令,但最好的情况是在kubernetes中使用PostStart hook

spec:
  containers:
  - name: test
    image: someimage
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "mysql -u root --password='hello123' -e \"GRANT ALL PRIVILEGES ON *.* TO 'websiteu5er'@'%' IDENTIFIED BY 'hello123';\""]

您可能还想在运行查询之前添加一些第二个sleep命令,以确保在连接到服务器之前服务器确实已启动。

还可以查看kubernetes文档,并详细了解lifecycle hooks

让我知道它是否有帮助。