在docker-compose中外包源代码以使用最小的磁盘空间

时间:2018-02-21 14:29:07

标签: docker nginx jenkins docker-compose

我在开发环境中成功使用docker,并希望现在在staging和prod中使用它。

我正在使用symfony开发一个Web应用程序,其中代码安装在docker容器的本地。对于staging和prod,我想将源代码“烘焙”到图像中,导致此时不再需要更改它。

目前我的服务“php”和“nginx”需要访问src文件。对于staging / prod,我会创建一个名为“src”的额外卷并将其挂载到两个服务。在其中一个服务(nginx / php)中,我将添加一个COPY命令,将构建时的src代码复制到已安装的“src”卷。

现在的问题如下:

每当我的代码的新版本存在时,整个图像都必须构建新的...最小的图像(nginx)的大小为200MB。因此每次我只想更新我的代码(大小只有10MB)时,整个容器(200MB)必须构建新的...

此外,我想将所有构建版本检入存储库。

随着时间的推移,这是相当昂贵的......

我的想法如下: 是否有可能只在每次代码更新时生成数据卷“src”(通过jenkins构建作业触发)并检查它们?

我认为,没有必要在每次构建时都建立很少变化的环境,比如php / nginx / mysql new ......

还是有另一种方法吗?

最初为所有需要的服务提供1,5GB是完全可以的,但是对于每个版本而言,存储库中的另外200 MB是太重了。

由于

2 个答案:

答案 0 :(得分:0)

首先,你所遵循的方法绝对是一种不好的做法。 docker容器应该是便携式的并且是独立的。依赖与主机绑定的数据量将使您的容器无法移植。

通过设计容器应该打包运行应用程序所需的所有依赖项。因此,如果源代码是必须提供的依赖项,则应该将源添加到每个映像。

您应该调查其他选项以缩小图像尺寸。根据您使用的编程语言,可以编译/压缩源代码,并且可以将较小的二进制文件复制到图像中。

最后要注意的是,使用非常不同的appraoches在环境(dev / staging / prod)之间进行部署通常是一个坏主意。最好采用类似的部署策略来避免意外错误。

答案 1 :(得分:0)

如果正确设置Dockerfile(see docs)以便最后添加代码,那么更新操作应该非常快,因为所有其他未更改的层都将被缓存。作为Docker工作流程的一部分,这是非常常见的做法。

您可以将同一图像用于本地开发,并将工作代码装载到容器中的代码上以进行活动开发。只要使用完全相同的代码重建图像,就应该保持一致性。您可以通过选择代码的哪些部分可能更改并相应地订购构建来进一步优化。

您可能还需要查看multi-stage build进程,您可以在其中进一步优化基本图像并缩小最终图像尺寸。