Closed2

【Docker】package.jsonなしでjsファイルをコマンド実行したい

やむ | serinaやむ | serina

グローバルインストールしているのに認識されずにエラーになる。

ディレクトリ

project-root/
├── js-schema/
│   ├── Dockerfile
│   └── main.js
└── docker-compose.yml

Dockerfile

FROM node:lts-alpine

RUN mkdir /app
WORKDIR /app

RUN npm install -g @apidevtools/swagger-parser json-schema-merge-allof
COPY ./main.js /app

CMD ["node", "main.js"]

main.js

const SwaggerParser = require('@apidevtools/swagger-parser');
const mergeAllOf = require('json-schema-merge-allof');

// 以下、省略

エラー内容

❯ docker run sha256:XXXXX
node:internal/modules/cjs/loader:1228
  throw err;
  ^

Error: Cannot find module '@apidevtools/swagger-parser'
Require stack:
- /app/main.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1225:15)
    at Module._load (node:internal/modules/cjs/loader:1051:27)
    at Module.require (node:internal/modules/cjs/loader:1311:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.<anonymous> (/app/main.js:32:23)
    at Module._compile (node:internal/modules/cjs/loader:1469:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1548:10)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Module._load (node:internal/modules/cjs/loader:1104:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/app/main.js' ]
}

Node.js v20.17.0
やむ | serinaやむ | serina

解決方法

NODE_PATHを設定してパスを通す。

Dockerfile

FROM node:lts-alpine

RUN mkdir /app
WORKDIR /app

RUN npm install -g @apidevtools/swagger-parser json-schema-merge-allof

COPY ./main.js /app
COPY ./index.yml /app

# この設定を追加
ENV NODE_PATH=/usr/local/lib/node_modules

CMD ["node", "main.js"]

このスクラップは2024/09/05にクローズされました