在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
。
摘要是这样的:
- 构build
builder
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依赖关系映像即可。
我希望这可以帮助别人。
问候