我目前正在容器化我的应用程序。该应用程序的一部分是NodeJS Express后端。
当我使用node index.js
或nodemon index.js
在控制台上运行它时,它没有任何问题。
在middlewares/index.js
内部,我确实通过authJwt.js
和verifySignup.js
导入require('./verifySignup)
和require('./authJwt)
。
当我从控制台运行我的应用程序时,这毫不奇怪地很好。但是,如果我使用以下Dockerfile代码构建我的docker-image:
# build environment
FROM node:14
# Working Directoy
WORKDIR /app
ENV FILE_UPLOADS="./files/uploads"
ENV FILE_UPLOADS_PART="./files/uploads_part"
ENV PORT=3001
ENV DB_HOST="localhost"
ENV DB_USER="root"
ENV DB_PASSDWORD="root_password"
ENV DB_NAME="upload_db"
ENV SECRET_KEY="bezkoder-secret-key"
# Copy Needed Files for Dependencies
COPY package.json /app/package.json
COPY yarn.lock /app/yarn.lock
# Install with YARN
RUN yarn install
# Copy Source Files
COPY ./ /app
EXPOSE 3001
CMD [ "yarn", "start" ]
当我运行图像时,它立即终止。查看日志,发现以下错误:$ docker logs 031241ce227a
yarn run v1.22.5
$ node index.js
internal/modules/cjs/loader.js:895
throw err;
^
Error: Cannot find module './verifySignUp'
Require stack:
- /app/middleware/middleware.js
- /app/routes/auth.routes.js
- /app/index.js
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:892:15)
at Function.Module._load (internal/modules/cjs/loader.js:742:27)
at Module.require (internal/modules/cjs/loader.js:964:19)
at require (internal/modules/cjs/helpers.js:88:18)
at Object.<anonymous> (/app/middleware/middleware.js:2:22)
at Module._compile (internal/modules/cjs/loader.js:1075:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1096:10)
at Module.load (internal/modules/cjs/loader.js:940:32)
at Function.Module._load (internal/modules/cjs/loader.js:781:14)
at Module.require (internal/modules/cjs/loader.js:964:19) {
code: 'MODULE_NOT_FOUND',
requireStack: [
'/app/middleware/middleware.js',
'/app/routes/auth.routes.js',
'/app/index.js'
]
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
然后,我使用docker export adoring_kowalevski > contents.tar
导出了docker-image,以查看图像中的文件系统,但是一切都在应有的位置。我希望经过一次绝望的尝试,可能会出现此问题,因为我在不同的文件夹中有多个
index.js
,因此我更改了除根目录中的所有名称以外的所有名称,但问题仍然存在。这就是为什么在错误日志中有一个middleware/middleware.js
的原因,它是在重命名middleware/index.js
之后。编辑:
我尝试使用rfr将我的引用从
require('../middleware')
更改为rfr('middleware')
。它仍然可以从控制台运行,但仍不能在容器内部。因此似乎该问题不会由于相对文件路径而发生。
最佳答案
原来我很傻(有点)。middleware/index.js
内部的导入看起来像这个require('./verifySignUp')
。
如果我们查看verifySignup.js
文件夹中的middleware
文件,可以看到该文件的名称不带大写字母“U”。
为什么它仍然可以从控制台运行? verifySignup.js
内部是以下代码:
module.exports = {
authJwt,
verifySignUp
};
在这里用大写的“U”写成。这意味着从控制台运行node index.js
仅关心module.exports
中写的内容,而不关心实际的文件名,但是在Docker内部运行时,文件名很重要。将文件从
verifySignup.js
重命名为verifySignUp.js
解决了我的问题。
关于node.js - 从Docker运行时的NodeJS App 'Module Not Found',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63693263/