我们正在讨论如何部署在docker容器中运行的应用程序。目前,我们在包含应用程序代码的管道中构建应用程序映像。这意味着每次应用程序更新时我们都必须构建docker镜像。
我们考虑的另一种方法是将应用程序代码放在服务器上的卷中。然后我们在服务器上使用git提取最新版本。所以图像不需要重建。
所以我们讨论的选项是:
最佳做法是什么?为什么?
答案 0 :(得分:1)
虽然这里的其他答案已经解释了在您的图像中构建代码的重点,但我还想更进一步,向您展示如何获得两个世界的好处,同时遵循最佳状态实践。
Docker最佳实践要求在部署之前将源代码构建到映像中,而不是部署安装了依赖项的映像,然后将源代码作为卷安装。
这为您提供了一个自包含的便携式容器,可以直接进行测试,部署或回滚。
我可能会考虑为什么要考虑热装代码吗?
热插拔代码吸引人的原因有几个 - 而且在不牺牲这种最佳实践的情况下很容易实现构建自包含图像:
构建Docker镜像可能会很慢,那么为什么只需热安装代码就可以重建一个小改动?
补充性最佳实践是使用安装所有依赖项的“基本映像” - 通常是构建docker映像的缓慢部分。关键的见解是这个基本图像不会经常改变!
但是从中获取的图像 - 安装源代码的应用程序映像 - 将随着您要部署的每个提交而改变。该衍生图像的构建速度非常快。 Dockerfile可以简单如下:
FROM myapp/base . # all dependencies installed in base image
ADD code.tar.gz /src # automatic untaring!
CMD [...] # whatever it takes to run your app
热安装可以加快开发周期,因为开发人员无需刷新其docker容器,重建并运行新容器只是为了查看更改。
这是一个公平的观点。我建议制作一个“dev”图像(也将来自你的基本图像),它可以通过卷安装代码,而不是你在测试和部署映像中的源代码安装步骤。
答案 1 :(得分:0)
每次使用新应用程序构建映像时,您都可以轻松地将其稍后部署到客户或生产服务器上。当docker镜像准备就绪时,您可以将其保存在存储库中。此外,您可以完全控制Docker正在使用当前应用程序。
如果将应用程序保存在已安装的卷中,则必须记住以下问题:
安装的卷更适合跟随casses:
要完全自动化,您可以:
答案 2 :(得分:0)
我相信你应该遵循第一种方法,即每次代码发生变化时重建docker镜像。原因是 -
我的建议是使用一些持续集成工具创建管道,并从代码构建,构建docker镜像并将其部署到您的环境中完全自动化流程。