我正在尝试将我的 Node.js 应用程序与 mysql 数据库连接 这是我的 dockerfile
FROM node:latest
WORKDIR /app
COPY . /app
RUN npm update
RUN npm install
RUN npm rebuild bcrypt
ENV SERVER_PORT 3000
EXPOSE $SERVER_PORT
CMD ["npm", "start"]
这是 myd docker-compose 文件
services:
mysqldb:
image: mysql:8.0
container_name: mysqlcontainer
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
volumes:
- ./dbinit/init.sql:/docker-entrypoint-initdb.d/0_init.sql
- $HOME/database:/var/lib/mysql
ports:
- 3306:3306
expose:
- 3306
environment:
MYSQL_DATABASE: hotel_managment
MYSQL_USER: admin
MYSQL_PASSWORD: letmein
MYSQL_ROOT_PASSWORD: letmein
SERVICE_TAGS: prod
SERVICE_NAM: mysqldb
networks:
- internalnet
nodeapp:
container_name: nodeappcontainer
build: .
image: nodeapp:v1
ports:
- 3000:3000
expose:
- 3000
depends_on:
- mysqldb
environment:
DB_HOST: mysqldb
DB_USER : 'root'
DB_PASSWORD: 'letmein'
DB_NAME : hotel_managment
DB_PORT : 3306
DB_CONNECTION_LIMIT : 10
SERVER_PORT : 3000
SERVICE_TAGS: prod
SERVICE_NAME: nodeappservice
networks:
- internalnet
networks:
internalnet:
driver: bridge
这是我的项目结构:(包含在图像中)
这是我的环境文件
DB_HOST = localhost
DB_USER = root
DB_PASSWORD = letmein
DB_NAME = hotel_managment
DB_PORT = 3306
DB_CONNECTION_LIMIT = 10
SERVER_PORT = 5000
这就是我连接到节点内数据库的方式:js
let connection = mysql.createConnection({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
});
我正在nodejs目录(文件夹)内运行此命令 docker-compose up -d --build
我收到此错误: `> [电子邮件受保护] 开始
node -r dotenv/config app.js 服务器正在侦听端口:3000 [电子邮件受保护] 开始 节点-r dotenv/config app.js 服务器正在侦听端口:3000 连接到数据库时出错:错误:连接ECONNREFUSED 172.22.0.2:3306 在 TCPConnectWrap.afterConnect [作为未完成] (节点:net:1606:16) { 错误号:-111, 代码:'ECONNREFUSED', 系统调用:'连接', 地址:'172.22.0.2', 端口:3306, 致命:真实 }`
我尝试了一切,但没有任何效果
如果您从 Docker 中运行节点应用程序,那么我认为您只需要在
.env
文件中使用容器名称即可:
DB_HOST=mysqlcontainer
DB_USER=root
DB_PASSWORD=letmein
DB_NAME=hotel_managment
DB_PORT=3306
DB_CONNECTION_LIMIT=10
SERVER_PORT=5000
在 Docker 上下文中,
localhost
并不是指 mysql 容器。