我正在尝试使用grunt / gulp在docker容器内部署一个nodejs应用程序构建过程的良好实践。
我对以下序列非常满意:
但在我发现的每个例子中,我都看到了不同的方法:
IMO,第一种方法生成更轻,更高效的容器,但所有的例子都使用第二种方法。我错过了什么吗?
答案 0 :(得分:3)
我看到的唯一区别是你可以在第二种方法中重现完整的grunt安装。
使用第一个,您可以在不同的环境中依赖于可能以不同方式完成的本地操作。
容器应该基于可以轻松复制的图像,而不是取决于包含“需要什么”的主机文件夹(不知道该部分是如何完成的)
如果安装附带的构建环境开销对于grunt映像来说太多了,您可以:
app.tar
”(I did that for Apache, that I had to recompile,创建deb package in a shared volume)。使用第一个容器中的卷
从基本图像创建容器docker run --it --name=app.inst --volumes-from=app.tar ubuntu untar /shared/path/app.tar
docker commit app.inst app
然后,最终结果是应用程序存在于其文件系统中的图像。
这是您的方法1和2之间的混合。
答案 1 :(得分:1)
解决方案1的一个变体是拥有一个“父 - >孩子”,这使得项目的构建非常快。 我会像dockerfile一样:
FROM node
RUN mkdir app
COPY dist/package.json app/package.json
WORKDIR app
RUN npm install
这将处理节点依赖项的安装,并有另一个dockerfile来处理应用程序“安装”,如:
FROM image-with-dependencies:v1
ENV NODE_ENV=prod
EXPOSE 9001
COPY dist .
ENTRYPOINT ["npm", "start"]
通过这种方式,您可以继续开发,并且如果您需要“重新安装”节点依赖项,Docker镜像的“构建”将会更快。如果在节点上安装新的依赖项,只需重新构建依赖项映像。
我希望这有助于某人。
此致