我想在一个实例/服务器中创建一个图像 A,但在那个实例中没有互联网连接。
那么我可以创建一个包含所有安装在我的机器上的包的图像 B,然后推送到 xxxx 并在图像 A 中使用它作为 FROM 标记吗?
它看起来像:
FROM x.x.x.x/B:latest
RUN ***
ENTRYPOINT
请为此问题提出正确的解决方案。
我想在一个实例/服务器中创建一个图像 A,但在那个实例中没有互联网连接。
那么我可以创建一个包含所有安装在我的机器上的包的图像 B,然后推送到 xxxx 并在图像 A 中使用它作为 FROM 标记吗?
它看起来像:
FROM x.x.x.x/B:latest
RUN ***
ENTRYPOINT
请为此问题提出正确的解决方案。
是的你可以。
首先,您说图像 A 位于没有 Internet 连接的服务器上。如果这是真的,那么除非您引用的 xxxx 是 localhost,否则您将无法访问您推送到 xxxx 的构建映像 B。
假设没有互联网完全回答这个问题:
Dockerfile B 包含你在基础镜像中想要的所有东西。建立那个。然后将图像移动到您正在构建图像 A 的无互联网服务器。(要移动图像,请查看 docker export 或 docker save 命令和/或谷歌“将 docker 图像从一个主机移动到另一个主机”。我最初的搜索将我带到这里:https ://blog.giantswarm.io/moving-docker -container-images-around/ )
(注意:对于任何想要执行此操作并且您有 Internet 连接的人,您可以将图像 B 推送到存储库,然后直接从 Dockerfile A 中从那里提取图像,这将跳过从主机到主机的移动部分。)
然后,就像您已经编写的那样,图像 A 的 Dockerfile 应该具有:
FROM imageB:latest
从您的第一个图像中提取。这一切都很容易。长话短说,是的,您可以构建自己的图像,然后基于该图像构建其他图像。
简短的回答 - 当然,你可以。您可以使用任何图像(包括您自己的图像)来构建新图像。
长答案 - 考虑使用 Docker multistage build
。这可以减少镜像数量和 docker 注册表占用的空间。
您可以在https://docs.docker.com/develop/develop-images/multistage-build/上阅读更多信息
简而言之 - 您创建一个单一 Dockerfile
的,您可以在其中定义多个图像,基于彼此。如果您不需要派生之外的基本图像,这就是您的情况。下面的例子将说明:
Dockerfile
# First create base image
FROM foo:latest as mybase # note we tag it 'mybase'
RUN blahblah
FROM mybase # here we derive new image, note Dockerfile is same!
RUN blahblahblah