我可以 use/build 自定义创建 docker 图像来创建另一个图像吗?

Can I use/build custom created docker image to create another image?

我想合二为一地创建图像 A instance/server,但在那种情况下没有互联网连接。

那么我可以用我机器上安装的所有包创建一个图像 B,然后推送到 x.x.x.x 并在图像 A 中使用它作为 FROM 标签吗?

它看起来像:

FROM x.x.x.x/B:latest
RUN ***
ENTRYPOINT

请为这个问题提出正确的解决方案。

是的,你可以。

不过,首先,您说图片​​ A 在没有互联网连接的服务器上。如果是这样,那么您将无法访问已推送到 x.x.x.x 的构建映像 B,除非您引用的 x.x.x.x 是本地主机。

假设没有互联网来完整回答问题:

Dockerfile B 包含您想要在基础映像中添加的所有内容。建立那个。然后将图像移动到您正在构建图像 A 的无互联网服务器。 (要移动图像,请查看 docker 导出或 docker 保存命令 and/or google 'moving a docker image from one host to another'。我最初的搜索引导我到这里:https://blog.giantswarm.io/moving-docker-container-images-around/ )

(注意:对于任何想要执行此操作并且您有互联网连接的人,您可以将图像 B 推送到存储库,然后直接从 Dockerfile A 中的那里拉取图像,这将跳过从主机到主机的移动部分。)

然后,就像您已经写过的那样,图像 A 的 Dockerfile 应该具有:

FROM imageB:latest

从你的第一张图片中提取。这一切都很容易。长话短说,是的,您可以构建自己的图像,然后基于该图像构建其他图像。

简答 - 当然可以。您可以使用任何图像(包括您自己的图像)来构建新图像。

长答案 - 请考虑 Docker multistage build 以达到您的目的。这允许减少图像数量和 space 被您的 docker 注册表占用。

您可以在 https://docs.docker.com/develop/develop-images/multistage-build/

上阅读更多内容

简而言之 - 您创建了一个 单个 Dockerfile,您可以在其中定义多个图像,这些图像基于彼此。如果您不需要派生之外的基本图像,这就是您的情况。下面的例子将说明:

Docker文件

# 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