У меня проблемы с подключением к базе данных MySQL в контейнере Docker с использованием NodeJs.
Состояния ошибки: "Error: Access denied for user 'username'@'172.19.0.3' (using password: NO)"
, но, насколько я вижу, я даю пароль.
Итак, мой вопрос: почему в сообщении об ошибке указано, что я не использую пароль, а пароль явно указан?
Часть моего кода:
/* file: ./nodejs-server/database/database.js */
const mysql = require('mysql2/promise');
let db = await mysql
.createConnection({ // Error: Access denied for user 'username'@'172.19.0.3' (using password: NO)
host: env.DB_HOST,
port: 3306,
user: env.MYSQL_USER,
password: env.MYSQL_PASSWORD,
database: env.MYSQL_DATABASE,
authSwitchHandler: (_, cb) => {
// workaround for node mysql bug #1507
cb(null, Buffer.alloc(0));
},
})
.catch((err) => {
throw new Error('Could not connect to the database');
});
Я проверил значение env.MYSQL_PASSWORD
и оно содержит правильный пароль.
Я не уверен, вызвана ли эта ошибка неправильным синтаксисом или настройкой моих контейнеров Docker.
# file: ./mysql-server/Dockerfile
FROM mysql:latest
VOLUME ["/etc/mysql", "/var/lib/mysql"]
EXPOSE 3306
# file: ./nodejs-server/Dockerfile
FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "npm", "run", "watch" ]
# file: ./docker-composer.yml
version: "3.3"
services:
nodejs:
build: ./nodejs-server
ports:
- "8001:8080"
links:
- db:db
env_file:
- ./.env-example
volumes:
- ./nodejs-server:/usr/src/app
db:
build: ./mysql-server
volumes:
- ./mysql-server/data:/docker-entrypoint-initdb.d #A folder /mysql-server/data with a .sql file needs to exist
env_file:
- ./.env-example
Контейнеры nodejs и mysql работают, так как я могу войти в командную строку, а nodejs правильно сеет страницу «Hello world».
Кроме того, контейнеры Docker подключаются, потому что когда яостановите контейнер mysql, я получаю еще одну ошибку, сообщающую, что невозможно установить соединение.
У меня есть GRANT USAGE ON *.* TO `username`@`%`
и GRANT ALL PRIVILEGES ON `databasename`.* TO `username`@`%`
, поэтому разрешения, похоже, в порядке.