[英]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.