我有一个node.js应用程序,它将运行时版本编译到dist
文件夹中。因此package.json
文件指定起始脚本node dist/index.js
。
我现在想要容器化它,但容器不需要有分发目录,那些文件确实应该存在于应用程序的根目录中,因此我的Dockerfile
包含行
COPY package.json /usr/src/app/
COPY dist/* /usr/src/app/
将运行时文件放在图像中。我遇到的问题是当docker文件发出最后一个命令时:
CMD ["npm", "start"]
它失败了,因为index.js
现在位于错误的位置(因为它在不存在的分发目录中查找它)。我可以通过发出:
CMD ["node", "index.js"]
相反,但这似乎是错误的事情。什么是正确的方法?
*更新I *
我修改了index.js
,因此它可以从项目的根目录运行(即它希望通过发出dist/
在node dist/index.js
文件夹中找到所需的资源),但是,当然,这也是一个问题,因为没有分发目录。这通常是如何接近的?
答案 0 :(得分:2)
我会编写所有相对于当前文件的javascript require调用,而不引用" dist"目录。因此,我们假设您在项目根目录中有index.js
和routes.js
。 index.js
通过var routes = require('./routes')
加载路由。当你编译它们时,将它们两个编译到dist
目录中,一切都应该很好。
如果您想通过项目根目录npm start
运行,可以配置node dist/index.js
。
对于docker,没有理由使用npm来启动你的应用程序。这是一个不必要的过程,没有任何好处。只需使用node index.js
在您的dockerfile中通过WORKDIR /usr/src/app
启动。