npm 找不到在docker compose环境中运行的node js应用程序的模块

nwlls2ji  于 2023-05-23  发布在  Docker
关注(0)|答案(9)|浏览(210)

我很抱歉我的非常新手的问题,但我有一个可怕的一天弄清楚这个错误,我有一个Express应用程序,我试图在docker compose中运行它。我使用了这个Dockerfile:

FROM mhart/alpine-node
RUN mkdir -p /usr/src/app
RUN chmod -R 777 /usr/src/app
WORKDIR /usr/src/app
RUN npm install node-gyp -g
RUN npm install nodemon -g
ENV NODE_ENV development
EXPOSE 3000

我的docker-compose文件的这一部分:

backend:
    mem_limit: 100m
    build:
      context: .
      dockerfile: dockerfiles/node/Dockerfile
    command: npm start
    depends_on:
      - mongo
      - elasticsearch
    volumes:
      - ./backend/:/usr/src/app
    ports:
      - 3000:3000
    links:
      - "mongo:mongo"
      - "elasticsearch:elasticsearch"

当我使用docker-compose时,我得到了这个错误:

backend_1        | npm info it worked if it ends with ok
backend_1        | npm info using npm@3.10.10
backend_1        | npm info using node@v6.9.5
backend_1        | npm info lifecycle service-designer@1.0.0~prestart: service-designer@1.0.0
backend_1        | npm info lifecycle service-designer@1.0.0~start: service-designer@1.0.0
backend_1        | 
backend_1        | > service-designer@1.0.0 start /usr/src/app
backend_1        | > nodemon index.js
backend_1        | 
backend_1        | [nodemon] 1.11.0
backend_1        | [nodemon] to restart at any time, enter `rs`
backend_1        | [nodemon] watching: *.*
backend_1        | [nodemon] starting `node index.js`
backend_1        | module.js:471
backend_1        |     throw err;
backend_1        |     ^
backend_1        | 
backend_1        | Error: Cannot find module 'dotenv'
backend_1        |     at Function.Module._resolveFilename (module.js:469:15)
backend_1        |     at Function.Module._load (module.js:417:25)
backend_1        |     at Module.require (module.js:497:17)
backend_1        |     at require (internal/module.js:20:19)
backend_1        |     at Object.<anonymous> (/usr/src/app/index.js:1:63)
backend_1        |     at Module._compile (module.js:570:32)
backend_1        |     at Object.Module._extensions..js (module.js:579:10)
backend_1        |     at Module.load (module.js:487:32)
backend_1        |     at tryModuleLoad (module.js:446:12)
backend_1        |     at Function.Module._load (module.js:438:3)
backend_1        | [nodemon] app crashed - waiting for file changes before starting...

如果我在***backend***容器中执行ls -al,我会得到一个完整的后端应用文件夹内容列表,但听起来node_modules依赖项无法识别。

mznpcxlj

mznpcxlj1#

一些额外的东西我发现有帮助。列出Docker镜像中安装的node包。在我的示例中,它们安装在/src目录中。

~]$ sudo docker run -it --rm <your Docker image> npm list
@johndoe /src
+-- cors@2.8.5
+-- dotenv@16.0.3
+-- express@4.18.2
`-- node-fetch@3.3.1

列出Docker镜像中包含已安装节点包的目录的内容。当然,应该有一个node_modules目录。

~]$ sudo docker run -it --rm test ls -l /src
total 36
drwxr-xr-x   69 root     root          4096 May 22 07:11 node_modules
-rw-r--r--    1 root     root         26405 May 22 07:11 package-lock.json
-rw-r--r--    1 root     root           416 May 22 07:11 package.json

如果使用docker run命令从镜像部署容器,我错误地使用了--volume选项,并将本地Docker主机上的文件挂载到容器中的/src目录。src目录是包含节点包的目录。这导致Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'dotenv' imported from /src/app.js为我返回。

sudo docker run --volume /path/to/local/directory:/src <your Docker image>

我只需要包含文件名,这样我就不会挂载整个/src目录。

sudo docker run --volume /path/to/local/file/example.txt:/src/example.txt <your Docker image>
imzjd6km

imzjd6km2#

如果您的Dockerfilepackage.json文件是正确的,但仍然存在以下问题:
1.确保您已经重建了容器映像。
1.试试看
docker-compose down -v
然后再用docker-compose up启动容器。

删除所有卷。

6ioyuze2

6ioyuze23#

您需要在容器中安装依赖项,这在Dockerfile中是缺失的。
常见的方法是创建一个已经知道你的应用程序的Dockerfile,并让它复制你的package.json文件并执行npm install
这允许您的容器在以后运行应用程序时查找所有代码依赖项。
请参见此处的示例:https://nodejs.org/en/docs/guides/nodejs-docker-webapp/
样本Dockerfile

FROM node:boron

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

当然,您可能需要为COPY命令调整路径。

fsi0uk1n

fsi0uk1n4#

我在运行docker-compose up时也遇到了同样的问题。
通过运行docker-compose up --build而不是docker-compose up解决了问题。

2q5ifsrm

2q5ifsrm5#

npm install添加到Dockerfile后,将node_modules添加到卷

volumes:
      - ./backend/:/usr/src/app
      - /usr/src/app/node_modules
tjjdgumg

tjjdgumg6#

它发生在我身上,因为我有大写的文件名。
建议将文件重命名为小写
删除dist文件夹
再跑

npm run start:dev

生成一个新的dist文件夹。
再次运行

docker build -t <name> .
ee7vknir

ee7vknir7#

如果你的Dockerfiles和compose文件是正确的,那么你应该这样做docker-compose build --no-cache然后你可以再次做docker-compose up。这为我解决了这个问题。

vcudknz3

vcudknz38#

确保在package.jsonscripts对象中,npm start具有nodemon命令来运行应用程序
示例:如果应用程序由server.js文件提供服务

"scripts": {
    "start": "nodemon server.js",
}
pkln4tw6

pkln4tw69#

我有同样的问题,你需要做的是简单地运行npm i安装所有的依赖项,并在重建后,问题解决

相关问题