我在使用NodeJs连接到Docker容器中的MySQL数据库时遇到了问题。
错误声明:"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-examplenodejs和mysql容器正在运行,因为我可以登录到命令行,nodejs正在正确地播下一个"Hello“页面。
另外,Docker容器正在连接,因为当我停止mysql容器时,我会收到另一个错误,告诉我无法建立连接。
我有GRANT USAGE ON *.* TO `username`@`%`和GRANT ALL PRIVILEGES ON `databasename`.* TO `username`@`%`,所以权限似乎没问题。
发布于 2019-03-12 09:06:24
解决方案是允许用户从172.19连接。*由于停靠容器IP可能是不可预测的,必须正确设置MySql用户权限。
https://stackoverflow.com/questions/55116951
复制相似问题