我想要的
我有一个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
中提取工作映像
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
型
3条答案
按热度按时间2nc8po8w1#
要使用图像的特定层作为另一个图像的基础,可以在
FROM
指令中直接使用该层的SHA 256哈希。例如,假设您有此Dockerfile
字符串
并且已经从这个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
。型
现在,使用
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并检查那里提到的选项。
tsm1rwdh2#
公认的答案在Docker的当前版本中不起作用,它不为每个层创建完整的镜像。(我相信从Docker 1.10开始)
这篇文章中描述了一个解决方法:https://medium.com/htc-research-engineering-blog/restore-rollback-layers-from-docker-image-a4e4b117d7e6。准备好卷起袖子吧!
vvppvyoh3#
在这种情况下,问题是
docker build
和docker-compose build
don't share the same cache这个镜像最初是用
docker-compose
构建的,我使用的是直接的Docker。当使用docker-compose时,缓存的层按预期使用。
虽然这并没有回答如何从一些指定的层构建图像的问题,但它确实清除了我的障碍。