在Docker容器内或外面运行Grunt / Gulp?

时间:2015-04-30 12:08:10

标签: node.js gruntjs docker gulp dockerfile

我正在尝试使用grunt / gulp在docker容器内部署一个nodejs应用程序构建过程的良好实践。

我对以下序列非常满意:

  • 使用grunt(或gulp)在容器外构建
  • 将./dist文件夹添加到容器
  • 在容器内运行npm install(带--production标志)

但在我发现的每个例子中,我都看到了不同的方法:

  • 将./src文件夹添加到容器
  • 在容器
  • 中运行npm install(带有dev依赖项)
  • 在容器内运行bower install(如果需要)
  • 在容器内运行grunt(或gulp)

IMO,第一种方法生成更轻,更高效的容器,但所有的例子都使用第二种方法。我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

我看到的唯一区别是你可以在第二种方法中重现完整的grunt安装。

使用第一个,您可以在不同的环境中依赖于可能以不同方式完成的本地操作。

容器应该基于可以轻松复制的图像,而不是取决于包含“需要什么”的主机文件夹(不知道该部分是如何完成的)

如果安装附带的构建环境开销对于grunt映像来说太多了,您可以:

  • 创建专用于安装的图片“app.tar”(I did that for Apache, that I had to recompile,创建deb package in a shared volume)。
    在您的情况下,您可以创建已安装应用程序的存档('tar')。
  • 使用第一个容器中的卷

    从基本图像创建容器
    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镜像的“构建”将会更快。如果在节点上安装新的依赖项,只需重新构建依赖项映像。

我希望这有助于某人。

此致