Почему Wordpress не удается подключиться к MySQL в этом приложении docker-compose?


Я пытаюсь настроить приложение docker-compose, которое запускает несколько сайтов wordpress, которые совместно используют один контейнер mysql.

Конфигурация

Вот соответствующее docker-compose.yml:

version: '3.3'

services:
  ##################
  # Gateway Server #
  ##################

  #
  #  NOTE:  nginx is included for completenes, but (a priori) not  
  #         relevant to the issue at hand.

  nginx:
    image: nginx:latest
    restart: always
    depends_on:
      - site0
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro

  ###################
  # Database Server #
  ###################

  mysql:
    image: mysql:latest
    restart: always
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/wpinit.sql:/docker-entrypoint-initdb.d/wpinit.sql:ro
    env_file:
      - ./mysql/mysql.env  # sets MYSQL_ROOT_PASSWORD

  ###################
  # Wordpress Sites #
  ###################

  site0:
    image: wordpress:latest
    restart: always
    depends_on:
      - mysql
    env_file:
      - ./wordpress/wordpress.env  # contains `WORDPRESS_DB_HOST=mysql:3306`
      - ./wordpress/site0/.env  # contains WORDPRESS_DB_(USER|NAME|PASSWORD)

Поскольку несколько сайтов wordpress будут совместно использовать контейнер mysql, больше невозможно использовать переменные среды для инициализации пользователей/таблиц/некорневых паролей. Поэтому я смонтировал на томе следующий скрипт /docker-entrypoint-initdb.d/:

CREATE DATABASE site0;
CREATE USER 'site0'@'localhost' IDENTIFIED BY 'supersecretpassword';
GRANT ALL PRIVILEGES ON site0.* TO 'site0'@'localhost';
FLUSH PRIVILEGES;

Симптомы

Запуск docker-compose up приводит к следующему результату из mysql:

mysql_1       | 2018-03-12T11:09:28.787698Z 2 [Note] Access denied for user 'site0'@'172.18.0.3' (using password: YES)

, которому вторит контейнер site0:

site0_1  | MySQL Connection Error: (1045) Access denied for user 'site0'@'172.18.0.3' (using password: YES)
site0_1  |
site0_1  | Warning: mysqli::__construct(): (HY000/1045): Access denied for user 'site0'@'172.18.0.3' (using password: YES) in Standard input code on line 22

Далее в выводе журнала, когда вызывается скрипт инициализации mysql, мы получаем:

mysql_1       | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/wpinit.sql
mysql_1       | mysql: [Warning] Using a password on the command line interface can be insecure.
mysql_1       | 2018-03-12T11:09:25.094158Z 5 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
mysql_1       | 2018-03-12T11:09:25.095076Z 5 [Warning] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
mysql_1       | 2018-03-12T11:09:25.097564Z 5 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
mysql_1       | 2018-03-12T11:09:25.097787Z 5 [Warning] 'user' entry 'site0@localhost' ignored in --skip-name-resolve mode.
mysql_1       | 2018-03-12T11:09:25.101138Z 5 [Warning] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
mysql_1       | 2018-03-12T11:09:25.102141Z 5 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
mysql_1       | 2018-03-12T11:09:25.102677Z 5 [Warning] 'db' entry 'site0 site0@localhost' ignored in --skip-name-resolve mode.
mysql_1       | 2018-03-12T11:09:25.103542Z 5 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
mysql_1       | 2018-03-12T11:09:25.103945Z 5 [Warning] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
mysql_1       | 2018-03-12T11:09:25.104155Z 5 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.

Диагностика

Сначала я хотел проверить, что таблицы, пользователи и пароли действительно создаются в контейнере mysql:

$ docker exec -ti wpsvc_mysql_1 bash
$ mysql -uroot -psupersecretpassword

mysql> SELECT EXISTS(SELECT * FROM mysql.user WHERE user = 'site0');
+-------------------------------------------------------+
| EXISTS(SELECT * FROM mysql.user WHERE user = 'site0') |
+-------------------------------------------------------+
|                                                     1 |
+-------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| site0              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.02 sec)

После двойной проверки того, что пароль базы данных для site0 был идентичен в ./wordpress/site0/.env и ./mysql/wpinit.sql, я поспешил сюда.

Что я делаю неправильно?

1 2

1 ответ:

Я предлагаю попробовать 'site0'@'%', потому что он не вызывается с одного и того же хоста.