Docker中Node.js容器无法找到mysql模块的问题求助
问题
作为Docker新手,我尝试将Node.js程序部署为Docker容器,该程序需连接另一个已运行的mysql容器(容器名为mysql)。目前mysql容器运行正常,搭配phpMyAdmin可正常访问、查询,但Node.js容器启动时报错无法找到mysql模块,错误码为MODULE_NOT_FOUND。
相关信息
应用代码
var http = require('http'); var url = require('url'); var mysql = require('mysql'); var dt = require('./mytestmodule');
Dockerfile
FROM node RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json . COPY package-lock.json . RUN npm install COPY . . EXPOSE 8080 CMD [ "node", "app.js" ]
Docker运行命令及错误输出
运行命令:
docker run --name mysecond --link mysql:db -p 8080:80 mysecond
错误输出:
node:internal/modules/cjs/loader:1051 throw err; ^ Error: Cannot find module 'mysql' Require stack: - /usr/src/app.js (... 其他内容 ...) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12) { code: 'MODULE_NOT_FOUND', requireStack: [ '/usr/src/app.js' ] }
我已通过NPM安装mysql,且mysql容器与phpMyAdmin的链接配置正常,按相同方式启动Node.js容器却无法成功,请问问题原因是什么?
原因分析与解决方案
核心原因
你在本地执行的npm install mysql是安装在本地环境,Docker容器是完全独立的运行环境,本地依赖不会自动同步到容器内。另外,若本地项目目录没有配置.dockerignore排除node_modules,本地的node_modules(尤其是Windows/macOS环境下安装的)会被复制到Linux环境的容器中,依赖包与容器系统不兼容,同样会导致模块找不到;如果是全局安装的mysql依赖,容器内更是完全没有这个模块。
解决步骤
确认
package.json包含mysql依赖
检查项目根目录的package.json,确保dependencies字段里有mysql包,示例:{ "dependencies": { "mysql": "^2.18.1" } }若没有,在本地项目目录执行
npm install mysql --save,将依赖写入package.json。添加
.dockerignore文件
在项目根目录创建.dockerignore文件,写入以下内容:node_modules npm-debug.log避免把本地的
node_modules复制到容器,保证容器内的npm install能重新安装适配Linux环境的依赖。重新构建镜像
执行命令重新构建Docker镜像:docker build -t mysecond .重启容器
用原命令重新启动容器即可:docker run --name mysecond --link mysql:db -p 8080:80 mysecond
补充优化
--link是Docker的旧特性,推荐使用自定义Docker网络实现容器间通信,更稳定灵活:
- 创建自定义网络:
docker network create my-app-network - 启动mysql容器时加入该网络:
docker run --name mysql --network my-app-network -e MYSQL_ROOT_PASSWORD=你的密码 -d mysql - 启动Node.js容器时加入同一网络:
此时Node.js代码中连接mysql的主机名可直接用docker run --name mysecond --network my-app-network -p 8080:80 mysecondmysql(容器名),无需使用db。
内容的提问来源于stack exchange,提问作者furball

