現在、アプリをコンテナ化する作業を行っています。アプリの一部はNodeJSExpressバックエンドです。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
解決しました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加