繁体   English   中英

从特定的图像层构建 docker 图像

[英]Build docker image from specific layer of image

我想要的是

我有一个 Dockerfile 不再构建,因为它的一些初始构建步骤依赖于不再可用的服务,并且逆向工程会很痛苦。 整个事情很快就会被重写,但现在我只想用包含问题步骤的层的修复来重建图像。

我的 Dockerfile 看起来像这样:

FROM ubuntu:14.04
RUN this_thing_that_breaks
RUN apt-get install etc
COPY blah

我基本上想使用第 3 层作为我的基础层并在此基础上构建。

我做了什么

  1. 从 repo 中拉取工作镜像: docker pull ecr/my-image:cache
  2. docker build --cache-from ecr/my-image:cache -t ecr/my-image:fix .

在这一点上,我希望我的构建使用:cache的现有层来构建:fix ,但我的构建从头开始并失败了。

这个层解释帖子似乎说在1.10 docker 镜像随其所有层作为一个整体发布后,这些层不再真正可访问。
但是,当我查看docker inspect ecr/my-image:cache ,我看到了一大堆层的 sha256 id。 这再次让我认为应该有一种方法可以指向特定层并将其用作缓存的基础。

是否可以在给定层的 sha256 id 列表的情况下构建 docker 映像?

我计划在我修好它之后用原子弹解决这个问题,所以优雅在这里不是必需的。

额外信息

$ docker version
Version:           18.09.1
API version:       1.39
OS/Arch:           darwin/amd64

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.1

要使用图像的特定层作为另一个图像的基础,可以直接在FROM指令中使用该层的 SHA256 哈希值。

例如,假设你有这个 Dockerfile

FROM ubuntu:14.04
RUN this_thing_that_breaks
RUN apt-get install etc
COPY blah

并且已经从这个 Dockerfile 成功构建了一个图像(当时, this_thing_that_breaks工作)。 RUN this_thing_that_breaks最近停止工作,我们现在无法构建映像。

比如说,已经构建好的镜像被标记为my-image:cache 要找到中断的确切层的 SHA256 id,请运行docker history my-image:cache并记下 SHA256 id(此处对应于RUN this_thing_that_breaks )。

假设记下的 SHA256 id 是066a73a3a0c4 现在删除RUN this_thing_that_breaks之前的所有指令并将其替换为FROM 066a73a3a0c4

FROM 066a73a3a0c4
RUN apt-get install etc
COPY blah

如今,打造新形象my-image:fix使用docker build --cache-from my-image:cache -t my-image:fix . . 现在,这应该使用已经缓存的特定中断层作为创建新图像的基础图像。

希望这可以帮助!

上一个答案:

为什么缓存没有使用可能是原因ubuntu:14.04图像ecr/my-image:cache和本地缓存ubuntu:14.04这里描述的形象都不是一样的:

https://github.com/moby/moby/issues/26065#issuecomment-249046559

如果FROM图像更改,则不会重用缓存。 这有点有用并且实际上很重要,因为否则,用户无法检测到基本映像中有重要的安全修复程序,因为他们总是使用缓存。 但这也可能让一些用户感到惊讶。 我认为我们不应该尝试通过一些 hack 来解决它,相反,如果某些用户想要不同的行为,他们应该只使用不可变的标签或摘要作为FROM图像。

因此,我看到的一种选择是使用docker rmi ubuntu:14.04删除本地缓存的ubuntu:14.04 ,然后运行docker build --cache-from ecr/my-image:cache -t ecr/my-image:fix

我希望这有效,但我还没有证实。 如果这不起作用,我建议检查此问题并检查那里提到的选项。

这种情况下的问题是docker builddocker-compose build不共享相同的缓存

该图像最初是用docker-compose构建的,我直接使用 docker。
使用 docker-compose 时,缓存层按预期使用。

虽然这并没有回答如何从某些指定层构建图像的问题,但它确实清除了我的障碍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM