You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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依赖,容器内更是完全没有这个模块。

解决步骤

  1. 确认package.json包含mysql依赖
    检查项目根目录的package.json,确保dependencies字段里有mysql包,示例:

    {
      "dependencies": {
        "mysql": "^2.18.1"
      }
    }
    

    若没有,在本地项目目录执行npm install mysql --save,将依赖写入package.json。

  2. 添加.dockerignore文件
    在项目根目录创建.dockerignore文件,写入以下内容:

    node_modules
    npm-debug.log
    

    避免把本地的node_modules复制到容器,保证容器内的npm install能重新安装适配Linux环境的依赖。

  3. 重新构建镜像
    执行命令重新构建Docker镜像:

    docker build -t mysecond .
    
  4. 重启容器
    用原命令重新启动容器即可:

    docker run --name mysecond --link mysql:db -p 8080:80 mysecond
    

补充优化

--link是Docker的旧特性,推荐使用自定义Docker网络实现容器间通信,更稳定灵活:

  1. 创建自定义网络:
    docker network create my-app-network
    
  2. 启动mysql容器时加入该网络:
    docker run --name mysql --network my-app-network -e MYSQL_ROOT_PASSWORD=你的密码 -d mysql
    
  3. 启动Node.js容器时加入同一网络:
    docker run --name mysecond --network my-app-network -p 8080:80 mysecond
    
    此时Node.js代码中连接mysql的主机名可直接用mysql(容器名),无需使用db。

内容的提问来源于stack exchange,提问作者furball

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:52:32