Docker处理映像而不是Dockerfile

时间:2019-01-05 00:09:27

标签: docker

有人可以向我解释为什么正常的Docker流程是从Dockerfile构建映像,然后将其上传到存储库,而不仅仅是将Dockerfile在存储库之间来回移动吗?

假设我们有一台开发笔记本电脑和一个带有Docker的测试服务器。

如果我们构建映像,则意味着上传和下载Dockerfile中的所有软件包。有时这可能会很大(例如PyTorch> 500MB)。

与其在服务器之间来回传输大型映像文件,不如在本地编译映像以验证其是否有效,而是主要传输小型Dockerfile并在服务器上构建映像,这没有意义吗?

3 个答案:

答案 0 :(得分:2)

这开始只是一条评论,但时间太长。可能不是一个全面的答案,但无论如何都可能包含有用的信息。


通常,Dockerfile将构成更大的构建过程的一部分,将先前阶段的输出文件复制到最终映像中。如果您要托管Dockerfile而不是最终映像,则还必须托管(通常是临时的)已处理文件或整个源代码库和构建脚本。

后者通常是为开源项目完成的,但为方便起见,还经常提供预构建的Docker映像。

一个很好的解决方案是使用multi-stage builds(在Docker CE 17.05和EE 17.06中引入)在Dockerfile中编写整个构建过程。但是,即使在单个Dockerfile中以平台无关的方式描述了完整的构建过程,仍必须提供完整的源存储库。

TL,DR:将Docker映像视为常规二进制文件。下载和安装很方便,而不会弄乱源文件。您可以 下载C应用程序的源代码并使用提供的Makefile进行构建,但是如果二进制文件可用于您的系统,为什么还要这么做?

答案 1 :(得分:1)

  

与其在服务器之间来回传输大图像文件,   可能不是在本地编译图像以进行验证吗   它可以工作,但主要是传输小型Dockerfile并构建   服务器上的图像?

绝对!例如,您可以在Docker Hub上设置automated build,每次将Dockerfile的更新版本签入GitHub存储库时,都将执行此操作。

或者您可以相应地设置自己的构建服务器/ CI管道。

答案 2 :(得分:0)

恕我直言,建立图像概念并将其放入存储库的原因之一也是与人们共享。例如,我们将Python的开箱即用图像称为执行所有与python相关的东西,以便在Dockerfile中运行python程序。同样,我们可以创建一个自定义代码(以我为apache安装所做的示例为例,其中包含一些自定义步骤(例如更改端口和另外执行一些步骤),我创建了它的映像,然后最终将其放到公司的存储库中。

几天后,我得知其他团队可能也正在使用它,现在,当他们共享它时,他们无需使用我的图像就可以进行任何更改,而应该这样做。