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

我试图找出一个良好的做法,使用grunt / gulp部署在Docker容器内的nodejs应用程序的构build过程。

我很满意以下顺序:

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

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

  • 将./src文件夹添加到容器
  • 在容器内运行npm install(使用dev依赖)
  • 在容器内运行凉亭安装(如果需要的话)
  • 在容器内部运行grunt(或gulp)

国际海事组织,第一种方法生成一个更轻,更有效的容器,但所有的例子都在使用第二种方法。 我错过了什么吗?

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

与第一个,你取决于在不同的环境可能做不同的地方行动。

一个容器应该基于一个可以容易地复制的图像,而不是依赖于包含“需要什么”的主机文件夹(不知道这个部分是如何完成的)


如果安装附带的构build环境开销对于一个咕噜声图像来说太多,您可以:

  • 创build一个专用于安装的图像“ app.tar ”( 我是为Apache做的,我不得不重新编译 , 在共享卷中创build一个deb包 )。
    在你的情况下,你可以创build一个安装的应用程序的档案(“焦油”)。
  • 使用来自第一个容器的卷从基本映像创build容器

     docker run --it --name=app.inst --volumes-from=app.tar ubuntu untar /shared/path/app.tar docker commit app.inst app 

那么最终的结果就是在其文件系统上存在应用程序的图像。

这是你的方法1和2之间的混合。

我想build议第三种方法,我已经做了一个静态生成的网站,单独的build设形象。

在这种方法中,主Dockerfile (项目根目录下的Dockerfile )变成了一个构build和开发的形象,在第二种方法中基本上做了所有事情。 但是,您在运行时覆盖了CMD ,即将构build的dist文件夹放在dist.tar或类似文件中。

然后,你有另一个文件夹(如image ),有一个Dockerfile 。 这个图像的作用只是提供dist.tar内容。 所以我们做一个docker cp <container_id_from_tar_run> /dist 。 然后Dockerfile只是安装我们的Web服务器,并有一个ADD dist.tar /var/www

摘要是这样的:

  • 构buildbuilder Docker镜像(无需Web服务器即可获得工作环境)。 在这一点上,应用程序是build立。 我们可以使用grunt serve或者任何命令来启动我们内置的开发服务器来开发容器。
  • 而不是运行服务器,我们重写默认命令来tar我们的dist文件夹。 像tar -cf /dist.tar /myapp/dist
  • 我们现在有一个带有/dist.tar工件的临时容器。 将其复制到您使用docker cp <container_id_from_tar_run> /dist.tar ./image/调用image实际部署Docker文件夹。
  • 现在,我们可以使用docker build ./image来构build小型Docker镜像,而不需要我们所有的开发依赖docker build ./image

我喜欢这种方法,因为它仍然是所有的Docker。 这种方法中的所有命令都是Docker命令,可以真正减less最终部署的实际映像。

如果你想用这种方法检查图像,请查看https://github.com/gliderlabs/docker-alpine ,它使用了构build器镜像(在构build器文件夹中)来构buildtar.gz文件,然后将其复制到他们各自的Dockerfile文件夹。

解决scheme1的一个变种是有一个“父母 – 孩子”,使项目的build设真的很快。 我会有像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镜像的“构build”将会更快,如果你需要“重新安装”节点依赖。 如果您在节点上安装新的依赖关系,只需重新构build依赖关系映像即可。

我希望这可以帮助别人。

问候

Interesting Posts