使用 Ubuntu 作为基础 Docker 映像时,存在一些许可证冲突,无法重新分发映像。
一种方法是将其推送到 hub.docker.com,其中基础镜像的层可用,因此只会推送新镜像的层。
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y gcc make
在上面的 Dockerfile 中,“FROM ubuntu:18.04”创建的第一层已经在 docker hub 中可用,因此不会被推送,而“RUN apt-get update && apt-get install -y gcc make”的另一层将只会被推送到新的仓库。并且在 docker pull 命令期间,第一层直接从 docker hub 上的 Ubuntu 发行版中调用,因此不会产生任何重新分发的许可证冲突。
现在我们计划从 docker hub 转移到我们需要推送应用程序的私有注册表。使用私有注册表,它将推送两个层(因为 ubuntu 基础映像在私有注册表中不可用)。在从私有注册表中拉取 docker 映像时,它会拉取与 ubuntu 的重新分发许可证冲突的两个层。
那么有没有什么方法可以只推送几层到私有 docker 注册表而不推送基础镜像的层呢?
在从不同的注册表中拉取层的同时,将拉取并加载 docker 映像。除了使用 docker pull 命令,我们还可以使用 curl 或任何其他命令来加载图像。
Docker 中有一个叫做外层的概念,但是在 Manifest 文件中找不到任何解释如何创建外层的资源。Microsoft 在分发基于 Windows 的 Docker 映像时使用了外部层的概念。