我用NodeJS编写了一个简单的Hello World应用程序,并试图将其部署在单节点Docker-Swarm集群上。但是,在(一个)主节点上,命令
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运行时,一切都按预期运行。此外,当我用--entrypoint "/bin/bash -c \"node ./index.js\""
覆盖“ docker service create”命令中的入口点时,一切正常。
index.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}/`);
});
Dockerfile的内容:
FROM node:12.16.1
WORKDIR /home/node/
# copy all resources
COPY . .
CMD ["node", "./index.js"]
文件结构:
当然,我可以简单地重写入口点以使事情正常运行,但我想了解为什么使用默认入口点脚本会在这里引起问题。
我非常感谢您的帮助!预先感谢。
如果您已将服务指定为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