繁体   English   中英

找不到在 docker 环境中运行的节点 js 应用程序的模块错误

[英]Cannot find module error for a node js app running in a docker environment

这个应用程序是用 ES6 编写的,并使用 babel 编译到 ES5。 构建文件按以下顺序存储在构建文件夹中。 dockerfile 驻留在构建文件夹的外部。

 -build ---public ---server ---shared ---package.json -Dockerfile

这是我的 docker 文件。

 FROM node:8.9-alpine ENV NODE_ENV production WORKDIR /usr/src/app ADD ./build/ /usr/src/app RUN npm install --production --silent RUN ls /usr/src/app/ RUN ls /usr/src/app/server/ EXPOSE 3000 CMD ["node", "/usr/src/app/server/index.js", "--config", "/usr/src/app/config.json"]

这是我在运行图像构建命令时得到的输出。

 Sending build context to Docker daemon 16.08MB Step 1/9 : FROM node:8.9-alpine ---> 406f227b21f5 Step 2/9 : ENV NODE_ENV production ---> Using cache ---> 090d3e742281 Step 3/9 : WORKDIR /usr/src/app ---> Using cache ---> fa2a344bd8ee Step 4/9 : ADD ./build/ /usr/src/app ---> 93559e34a45a Step 5/9 : RUN npm install --production --silent ---> Running in ebc2b6b2ba1a added 212 packages in 15.212s Removing intermediate container ebc2b6b2ba1a ---> b49180988a07 Step 6/9 : RUN ls /usr/src/app/ ---> Running in b140530cb8ca build-info.json node_modules package-lock.json package.json public server shared Removing intermediate container b140530cb8ca ---> 0712e1b84e1a Step 7/9 : RUN ls /usr/src/app/server/ ---> Running in b6570fbc8d2c auth configuration database files index.js sessions users utils Removing intermediate container b6570fbc8d2c ---> c49775551756 Step 8/9 : EXPOSE 3000 ---> Running in 9318dfc0f183 Removing intermediate container 9318dfc0f183 ---> ad20aec92973 Step 9/9 : CMD ["node", "/usr/src/app/server/index.js", "--config", "/usr/src/app/config.json"] ---> Running in fa6c2e388906 Removing intermediate container fa6c2e388906 ---> ba1ced3be150 Successfully built ba1ced3be150 Successfully tagged tiqri:myclaim SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

创建图像后,我使用以下命令启动图像。 “docker run -d -v C:\\portal\\environments\\development:/usr/src/app/ -p 3000:80 f057e4bc8191” 有配置文件的卷映射。

但是容器,没有运行。 当我检查日志时,它显示以下错误。

 C:\\portal>docker logs c819d39fea61 module.js:540 throw err; ^ Error: Cannot find module '/usr/src/app/server/index.js' at Function.Module._resolveFilename (module.js:538:15) at Function.Module._load (module.js:468:25) at Function.Module.runMain (module.js:684:10) at startup (bootstrap_node.js:187:16) at bootstrap_node.js:608:3

即使所有文件夹都在 docker 容器中(RUN ls- 显示容器中的文件夹结构),我还是不明白为什么会出现此错误。 尽管如此,由于此错误,我无法启动容器。

更新

根据@Marcos Casagrande 给出的答案,对 docker 文件和容器运行命令进行了如下更改。 现在我收到一个新错误。

在 Dockerfile 中进行更改后。

 FROM node:8.9-alpine ENV NODE_ENV production WORKDIR /usr/src/app ADD ./build/ /usr/src/app RUN npm install --production --silent && mv node_modules ../ RUN mkdir /usr/src/app/environments RUN mkdir /usr/src/app/environments/development RUN ls /usr/src/app/ RUN ls /usr/src/app/server/ EXPOSE 3000 CMD ["node", "/usr/src/app/server/index.js", "--config", "/usr/src/app/environments/development/config.json"]

容器运行命令更改如下,“docker run -d -v C:\\portal\\environments\\development:/usr/src/app/environments/development -p 3000:80 ca290d67ff34”

然后我在检查日志时收到以下错误。 容器尚未启动。

 /usr/src/app/environments/development/config.json /usr/src/app/environments/development/config.json fs.js:646 return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); ^ Error: ENOENT: no such file or directory, open '/usr/src/app/environments/development/config.json' at Object.fs.openSync (fs.js:646:18) at Object.fs.readFileSync (fs.js:551:33) at loadJSON (/usr/src/node_modules/convict/lib/convict.js:364:25) at /usr/src/node_modules/convict/lib/convict.js:501:17 at Array.forEach (<anonymous>) at Object.loadFile (/usr/src/node_modules/convict/lib/convict.js:500:13) at Object.<anonymous> (/usr/src/app/server/configuration/configuration.js:156:19) at Module._compile (module.js:643:30) at Object.Module._extensions..js (module.js:654:10) at Module.load (module.js:556:32)

在不知道C:\\portal\\environments\\development的内容的情况下,我会假设其中没有server/index.js

即使所有文件夹都在 docker 容器中(RUN ls- 显示容器中的文件夹结构),我还是不明白为什么会出现此错误。 由于此错误,我仍然无法启动容器。

RUN ls复制构建目录后执行,在构建docker镜像时,如果在启动容器时运行ls会看到没有server/index.js

当您将build文件夹复制到/usr/src/app/ ,您在/usr/src/app上安装development文件夹时会覆盖该文件。

最简单的方法是将C:\\portal\\environments\\development挂载到/usr/src/app/development

docker run -d -v C:\portal\environments\development:/usr/src/app/development/ -p 3000:80 f057e4bc8191

您也可以在/usr/src/app上安装development ,然后使用在图像上build/server

-v C:\portal\environments\development:/usr/src/app/ -v /usr/src/app/server

您必须为构建映像中需要的每个文件夹执行此操作。

-v /usr/src/app/server -v /usr/src/app/public -v ...

我在运行 docker 容器时遇到了类似的问题。 我发现我可能错误地创建了图像,我通过删除图像并重建来解决这个问题。 但首先我必须删除图像的现有容器,如下所示

    docker rm containerId

然后我删除了像下面这样的图像

    docker rmi imageId

然后我重建了图像并运行以创建一个新容器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM