Почему 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
, я поспешил сюда.
Что я делаю неправильно?