docker生产代码构建
Posted
技术标签:
【中文标题】docker生产代码构建【英文标题】:docker production code build 【发布时间】:2018-09-25 22:19:28 【问题描述】:当使用 docker 创建生产版本时,人们使用什么策略来编译和捆绑代码。
所以在 docker 世界之外,我会创建一个构建(使用某种 npm 命令),它会创建一个 dist.代码(没有任何源代码,例如丑化和压缩的 javascript),然后我将 Web 服务器指向 dist 文件夹。
在 docker world 中,您将在哪里构建代码,是在 docker 映像中还是在主机操作系统上,只需将 dist 文件夹复制到 docker 映像中?基本上我不想要 docker 映像/容器中的整个 npm_modules 和所有源代码文件。
知道如何实现吗?
谢谢
【问题讨论】:
您可能还对multi-stage Docker builds感兴趣。 “基本上我不想要整个 npm_modules 和 docker 镜像/容器中的所有源代码文件。” - 为什么不呢? 那是因为,它使图像尺寸变大,在应用程序运行时不使用 node_modules 并且将源代码部署到生产通常是不好的做法。 “应用程序运行时不使用 node_modules” - 怎么回事?生产中使用的模块是从该目录加载的 @ConstantinGalbenu - 没有你的devDependencies
在生产中当然感觉很好。在您运行类似 Webpack 的资产管道的世界中,您也不需要 dependencies
,因为您的生产工件是资产包。
【参考方案1】:
听起来你在担心两个不同的、有效的问题:
-
确保隔离/可重现的生产环境。
确保隔离/可重现的构建环境(用于构建 #1)。
您可以使用您建议的方法来实现这两个目标 - 将构建步骤作为您的 Dockerfile
的一部分运行。但这有您提到的缺点 - 您在运行时留下了所有源/开发工件,除非您采取明确的步骤将它们全部删除。
Docker 引入了multi-stage builds 以在一定程度上缓解这个问题 - 它有效地允许您将多个层“压缩”为一个。但这并不能消除需要显式清理的问题。
所以根据我的经验,最常见的解决方案确实是在外部构建您的工件,然后 COPY
将其放入您的生产映像中。
这解决了问题#1,但不是#2。所以更进一步——在 Docker 容器中构建你的 Docker 镜像! CI 平台越来越多地支持这种方法作为一流的概念 - 参见例如Circle CI's Docker executor.
【讨论】:
【参考方案2】:在 Docker 中,一般来说,您希望创建一个软件映像,其中包含应用程序在任何机器上运行所需的所有内容。这就是 Docker 的用途:将应用程序及其依赖项绑定到单个工件中,以便它可以在安装 Docker 的任何地方运行。
当您使用像 Docker swarm 这样的编排器时,自给自足的镜像非常方便。编排器可以通过拉取图像并启动容器在任何属于网络(即swarm)的机器上运行容器。如果主机和镜像都没有包含它需要的所有内容,那么容器就会失败。
在某些情况下,您需要在容器运行时非常轻松地更改容器内的文件,例如在开发中。在这种情况下,您将主机上的本地目录挂载到容器中(请参阅volumes);这样,您只需修改主机中的文件,修改就会立即在容器内传播。即使在这种情况下,您的图像也应该包含在其他机器上运行应用程序所需的文件;使用卷只是将它们隐藏在开发环境中。
【讨论】:
我认为这并没有触及 OP 问题的核心 - 他/她应该使用什么工作流程来获得自给自足的图像? @OliverCharlesworth 我希望至少能帮到他以上是关于docker生产代码构建的主要内容,如果未能解决你的问题,请参考以下文章