从镜像的特定层构建Docker镜像

k4ymrczo  于 9个月前  发布在  Docker
关注(0)|答案(3)|浏览(122)

我想要的

我有一个Dockerfile,它不再构建,因为它的一些初始构建步骤依赖于不再可用的服务,这将是一个痛苦的反向工程。这整个事情将很快被重写,但现在我想只是重建图像与修复包含问题步骤的层。
我的Dockerfile看起来像这样:

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

字符串
我基本上想使用第三层作为我的基础层,并建立在此之上。

我所做的

1.从repo:docker pull ecr/my-image:cache中提取工作映像

  1. docker build --cache-from ecr/my-image:cache -t ecr/my-image:fix .
    在这一点上,我希望我的构建使用现有的层从:cache构建:fix,但我的构建从头开始,失败了。
    This layer explanation post似乎是说,在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

2nc8po8w

2nc8po8w1#

要使用图像的特定层作为另一个图像的基础,可以在FROM指令中直接使用该层的SHA 256哈希。
例如,假设您有此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。要找到确切的层的SHA 256 id,请运行docker history my-image:cache并记下SHA 256 id(这里对应于RUN this_thing_that_breaks的那个)。
假设记下的SHA 256 id是066a73a3a0c4。现在删除RUN this_thing_that_breaks之前的所有指令,并将其替换为FROM 066a73a3a0c4

FROM 066a73a3a0c4
RUN apt-get install etc
COPY blah


现在,使用docker build --cache-from my-image:cache -t my-image:fix .构建新图像my-image:fix。现在,这应该使用已经缓存为基础图像的特定中断层来创建新图像。
希望这对你有帮助!

上一个回答:

不使用缓存的原因可能是ecr/my-image:cache中的ubuntu:14.04图像和本地缓存的ubuntu:14.04图像不相同,如下所述:
https://github.com/moby/moby/issues/26065#issuecomment-249046559
如果FROM映像发生变化,则不会重用缓存。这是一种有用的,实际上也很重要,因为否则,用户无法检测到基础映像中有重要的安全修复,因为他们总是使用该高速缓存。但这也可能会让一些用户感到惊讶。我认为我们不应该尝试做一些黑客来解决它,相反,如果一些用户想要不同的行为,他们应该只使用不可变的标签或标签作为FROM图像。
因此,我看到的一个选项是使用docker rmi ubuntu:14.04删除本地缓存的ubuntu:14.04,然后运行docker build --cache-from ecr/my-image:cache -t ecr/my-image:fix
我希望这能起作用,但我还没有确认。如果这不起作用,我建议检查this issue并检查那里提到的选项。

tsm1rwdh

tsm1rwdh2#

公认的答案在Docker的当前版本中不起作用,它不为每个层创建完整的镜像。(我相信从Docker 1.10开始)
这篇文章中描述了一个解决方法:https://medium.com/htc-research-engineering-blog/restore-rollback-layers-from-docker-image-a4e4b117d7e6。准备好卷起袖子吧!

vvppvyoh

vvppvyoh3#

在这种情况下,问题是docker builddocker-compose builddon't share the same cache
这个镜像最初是用docker-compose构建的,我使用的是直接的Docker。
当使用docker-compose时,缓存的层按预期使用。
虽然这并没有回答如何从一些指定的层构建图像的问题,但它确实清除了我的障碍。

相关问题