Ошибка MODULE_NOT_FOUND в Docker -Подогрев приложения NodeJS - PullRequest
0 голосов
/ 12 апреля 2020

Я написал простое приложение Hello World в NodeJS и попытался развернуть его на одном узле Docker - Теплый кластер. Однако на (одном) главном узле команда

docker service create --with-registry-auth --name test-backend --env APP_HOST=0.0.0.0 --env APP_PORT=3000 --network custom-overlay-net registry.example.com/<user>/<image>:latest test-backend

приводит к следующей ошибке:

internal/modules/cjs/loader.js:985
   throw err;
   ^

 Error: Cannot find module '/home/node/test-backend'
     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:982:15)
     at Function.Module._load (internal/modules/cjs/loader.js:864:27)
     at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
     at internal/main/run_main_module.js:18:47 {
   code: 'MODULE_NOT_FOUND',
   requireStack: []
 }

Интересно, что когда я Запустите образ как автономный контейнер docker, или с помощью docker -compose, все работает как положено. Также, когда я перезаписываю точку входа в команде docker service create с помощью --entrypoint "/bin/bash -c \"node ./index.js\"", все работает нормально.

Содержимое индекса. js:

const http = require('http');

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});
if (!process.env.APP_HOST) {
        console.error('Please specify the APP_HOST environment variable');
}

if (!process.env.APP_PORT) {
    console.error('Please specify the APP_PORT environment variable');
}

server.listen(parseInt(process.env.APP_PORT), process.env.APP_HOST, () => {
  console.log(`Server running at http://${process.env.APP_HOST}:${process.env.APP_PORT}/`);
});

Содержимое файла Docker:

FROM node:12.16.1

WORKDIR /home/node/

# copy all resources
COPY . .

CMD ["node", "./index.js"]

Структура файла:

  • index. js
  • Dockerfile
  • package. json

Конечно, я мог бы просто переопределить точку входа, чтобы все заработало, но я хотел бы понять, почему использование сценария точки входа по умолчанию вызывает проблемы здесь.

Я ценю любую помощь! Заранее спасибо.

1 Ответ

1 голос
/ 12 апреля 2020

Вам не нужен test-backend в качестве аргумента, учитывая, что вы указали службу с --name.

Достаточно следующего:

docker service create --with-registry-auth --name test-backend --env APP_HOST=0.0.0.0 --env APP_PORT=3000 --network custom-overlay-net registry.example.com/<user>/<image>:latest

Примечание: Как отметил @Dmytro Sirant, когда добавляется test-backend - он принимается как CMD ["test-backend"], что приведет к указанной ошибке.

...