分享 Dockerfile 和 Docker 镜像的区别是什么?

6

我正在尝试充分理解Docker的最佳实践,并澄清以下两者之间的区别:

  1. 共享 Dockerfile(规格/构建配置),包括语言特定的配置文件(例如Python的 requirements.txt 或Node的 package.json)。

  1. 通过注册表(如Docker Hub)创建和共享Docker镜像?

在第一种情况下,用户需要克隆存储库以获取规格,并运行 docker build 以创建镜像。

_

在开始使用Docker或处理个人项目时,存储和共享“Docker代码”(缺乏更好术语)的一般最佳实践是什么?

在哪种情况下最好通过注册表共享已构建的镜像?


2
如果我使用了你的应用程序,那么假设你的图像已经正确标记并且是静态的(例如,一旦发布新图像就不会更改),我希望能够访问图像和规格。如果我想要使用预发布版本或者只是想要修改代码,那么我会克隆规格并进行修改,然后构建我的自定义图像,并在部署中使用自己的图像(例如,在向上游 PR 后)。我维护公共存储库和映像。 - masseyb
2
注意:如果我只能访问图像,您可以期望我检查图像,包括但不限于浏览任何源代码或脚本,这些源代码或脚本可能位于图像的任何图层中(如果您试图发布公共图像以供私人使用,则应将它们提供为已编译的二进制文件)。 - masseyb
当你说“有规格书的访问权限”时,你是指git仓库中的Dockerfilerequirements.txt等吗? - urosc
1
是的,我可以访问构建图像所需的所有内容。 - masseyb
非常好的解释,谢谢masseyb! - urosc
1个回答

4

简述

image推送到公共仓库可以使他人pull构建好的imagerun它。提供源代码和Dockerfile的访问权限可以使他人在本地build镜像。它们并不是相互排斥的。



例如,我会在Docker Hub上发布公共镜像,以便在Kubernetes中运行自托管的GitHub Actions Runners。这些发布是使用GitHub Actions从公共GitHub存储库完成的。我计划支持发布版本(从git tag标记构建的tag版本)(即如果有人安装了一个发布版本并报告了问题),但同时所有内容都可供人们自由修改(开源+1),没有任何限制(MIT许可证)。比如说你想向runner镜像添加一些apt软件包,那就去做吧,然后构建和使用你自己的镜像(...如果对其他用户有意义,那么也许考虑创建一个pull request来进行更改)。

可能能够使用专有许可证托管公共存储库,但需要确认其合法性

你可以绝对托管私有存储库并发布公共镜像,但要注意,如果你试图隐藏你的代码,那么如果我得到它,我会检查你的镜像,所以建议构建编译后的二进制文件(即go程序从头开始构建FROM scratch)。

你也可以绝对地托管私有存储库,并将你的镜像发布到私有docker仓库,然后控制对你的镜像的访问(例如分发已配置了你的私有镜像的docker-compose.yml以及要求客户进行docker loginpull这些镜像)。

1
当然,您也可以将所有这些混合在一起。我还维护完全私有的存储库和图像发布,位于我的Lazybit-ch组织下。 - masseyb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接