警告:mysqli_real_connect():(HY000 / 1698):用户'root'@'localhost'-Docker

时间:2019-10-10 11:34:29

标签: wordpress docker

我试图用supervisor来解决Wordpress的Docker镜像时遇到的困难。该代码来自信誉良好的来源:

https://github.com/how2dock/docbook/tree/master/ch01/supervisor

这是我的Dockerfile

FROM ubuntu:19.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get -y install \
 apache2 \
 php7.2 \
 php7.2-mysql \
 supervisor \
 wget

RUN echo 'mysql-server mysql-server/root_password password root' | debconf-set-selections && \
echo 'mysql-server mysql-server/root_password_again password root' | debconf-set-selections

RUN apt-get install -qqy mariadb-server

RUN wget http://wordpress.org/latest.tar.gz && \
 tar xzvf latest.tar.gz && \
 cp -R ./wordpress/* /var/www/html && \
 rm /var/www/html/index.html

RUN (/usr/bin/mysqld_safe &); sleep 5; mysqladmin -u root -proot create wordpress

COPY wp-config.php /var/www/html/wp-config.php
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 80

CMD ["/usr/bin/supervisord"]

和我的wp-config.php

的一部分
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'root');

/** MySQL database password */
define('DB_PASSWORD', 'root');

/** MySQL hostname */
define('DB_HOST', 'localhost');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

supervisord.conf

[supervisord]
nodaemon=true

[program:mysqld]
command=/usr/bin/mysqld_safe
autostart=true
autorestart=true
user=root

[program:httpd]
command=/bin/bash -c "rm -rf /run/httpd/* && /usr/sbin/apachectl -D FOREGROUND"

构建容器; docker build -t wordpress .并使用docker run -d -p 82:80 wordpress运行Web服务器。浏览到http://localhost:82,期望找到一个闪亮的新WP安装-仅找到:

Access denied for user 'root'@'localhost'

我尝试了几种数据库用户名/密码组合。我是Docker的新手。我想念什么?

1 个答案:

答案 0 :(得分:0)

为什么您要用此Dockerfile重新发明轮子?并违反经验法则,每个容器只能进行一次处理?

对于MySQL,拥有Dockerfile并使用构建时间并不那么简单。 MySQL服务启动后,您需要在运行时使用入口点创建用户。

将建议像这样简单地使用offical WordPress image and MySQL

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

现在问您一个问题,原因是您的Docker容器中没有用户。

RUN (/usr/bin/mysqld_safe &); sleep 5; mysqladmin -u root -proot create wordpress

每个run指令在其自己的shell中执行。因此,上面的命令将无法完成您期望的工作。您需要像MySQL官方dockerfile一样将这些步骤移至entrypoint

另一个建议是,将MySQL用作基本映像并根据需要扩展,但是再次需要一些适当的入口点才能使用MySQL。它不像WordPress或节点容器。