我有情景。我想在一个实例/服务器中创建一个映像,但是在那种情况下没有互联网连接。
那么我可以在计算机上安装了所有软件包的情况下创建B映像,然后推送到x.x.x.x并将其用作FROM标记在A映像中使用吗?
它看起来像:
FROM x.x.x.x/B:latest
RUN ***
ENTRYPOINT
请针对此问题提出正确的解决方案。
答案 0 :(得分:2)
是的,可以。
不过,首先,您说图像A在没有互联网连接的服务器上。如果是这样,那么除非您引用的x.x.x.x是本地主机,否则您将无法访问已推送到x.x.x.x的构建映像B。
要在没有互联网的情况下完全回答问题:
Dockerfile B包含基本映像中所需的所有内容。建立那个。然后将图像移至要在其上构建图像A的无互联网服务器。 (要移动映像,请查看docker export或docker save命令和/或google'将docker映像从一台主机移动到另一台主机。我的最初搜索将我引到这里:https://blog.giantswarm.io/moving-docker-container-images-around/)
(注意:对于任何想要执行此操作并且您具有Internet连接的人,您都可以将映像B推送到存储库,然后直接从Dockerfile A中将映像从那里拉出,这将跳过从主机到主机部分的移动。 )
然后,就像您已经写过的一样,映像A的Dockerfile应该具有:
FROM imageB:latest
从第一张图片中拉出。这一切都非常容易。长话短说,是的,您可以构建自己的图像,然后基于该图像构建其他图像。
答案 1 :(得分:0)
简短的回答-当然可以。您可以使用任何图像(包括您自己的图像)来构建新图像。
长答案-考虑使用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