使用docker创建生产构建时,人们使用什么策略来编译和捆绑代码。
所以在docker世界之外,我会创建一个构建(使用某种npm命令),这将创建一个dist。代码(没有任何源代码,例如uglified和压缩的javascript)然后我将Web服务器指向dist文件夹。
在docker world中你会在哪里构建代码,它是在docker镜像中还是在主机os上,只是将dist文件夹复制到docker镜像?基本上我不希望docker镜像/容器中的整个npm_modules和所有源代码文件。
知道如何实现这个目标吗?
由于
答案 0 :(得分:1)
在Docker中,通常,您希望创建一个软件映像,其中包含应用程序在任何计算机上运行所需的所有内容。这就是Docker用于:将Application及其依赖项绑定到单个工件中,以便它可以在任何安装Docker的地方运行。
当您使用像Docker swarm这样的协调器时,自给自足的图像非常方便。协调器可以通过拉动图像并启动容器,在任何属于网络(即群集)的计算机上运行容器。如果主机既没有包含所需的全部图像,那么容器也会失败。
在某些情况下,您需要在运行时非常容易地更改容器内的文件,例如在开发中。在这种情况下,您将主机的本地目录挂载到容器中(请参阅volumes);通过这种方式,您只需修改主机中的文件,修改就会立即在容器内传播。即使在这种情况下,您的图像也应包含在其他计算机上运行应用程序所需的文件;使用卷只是将它们隐藏在开发环境中。
答案 1 :(得分:1)
听起来你好担心两个不同的,有效的问题:
您可以使用您建议的方法实现这两种方法 - 将构建步骤作为Dockerfile
的一部分运行。但是这有你提到的缺点 - 你在运行时留下了所有的源/开发工件,除非你采取明确的步骤将它们全部删除。
Docker介绍multi-stage builds有点缓解了这个问题 - 它有效地让你“挤压”#34;多层融为一体。但它并没有消除需要明确清理的问题。
根据我的经验,最常见的解决方案是在外部构建工件,然后COPY
将其嵌入到生产映像中。
解决问题#1,但不解决问题#2。所以更进一步 - 在Docker容器中构建Docker镜像! CI平台越来越多地支持这种方法作为一流的概念 - 参见例如Circle CI's Docker executor