我想要的
我有一个不再构建的Dockerfile,因为它的一些初始构建步骤依赖于不再可用的服务,因此进行反向工程很痛苦。整个过程将很快被重写,但是现在我只想使用包含问题步骤的图层中的修复程序来重建图像。
我的Dockerfile看起来像这样:
FROM ubuntu:14.04
RUN this_thing_that_breaks
RUN apt-get install etc
COPY blah
我本质上想将第3层用作基础层,并在此基础上构建。
我做了什么
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
最佳答案
要将图像的特定层用作其他图像的基础,可以在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
因此,我看到的一种选择是使用
ubuntu:14.04
删除本地缓存的docker rmi ubuntu:14.04
,然后运行docker build --cache-from ecr/my-image:cache -t ecr/my-image:fix
。我希望这能奏效,但我尚未确认。如果这不起作用,建议您检查this issue并检查其中提到的选项。
关于docker - 从特定的图像层构建docker图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54413239/