Docker build 构建镜像时回退到某一步 (使用dockerfile的情况下回退到指定的step!)

tech2022-10-24  149

文章目录

前言1 场景2 解决方案补充 2020年9月3日13:07:34小结

前言

如题,我在用dockerfile构建镜像的时候在Step 14/16的时候出现了问题,我不想重新开始构建,因为太费时间,所以想尝试回退到某一步。在此记录解决方案。

1 场景

运行指令: docker built .

Step 14/16 : RUN xxx(省略) —> Running in f364a5510538 ERROR: Could not open requirements file: [Errno 2] No such file or directory: ‘xxx/requirements.txt’

emmm,分析了一下之后找到原因,发现是dockerfile里面有 COPY . . ,这个项目的目录是这样的:

project ---- dir1 ---- dir2 -------- some files ---- docker -------- Dockerfile

构建需要的Dockerfile在docker文件夹下,所以我当时是在docker目录下打开的终端,输入的docker built .,这下就不妙了,因为 COPY . . 会把当前目录下的文件拷贝过去。。。所以最后导致了这样的错误。

找到原因后,我们需要回退到 COPY . . 之前的step。 如下讲述具体解决方案。

2 解决方案

Dockerfile部分内容如下:

RUN apk update \ \ # Install Python && apk add \ py3-psutil \ python3 \ yaml-dev # Setup environment RUN apk update \ \ # Install PHP && apk add \ php7 \ php7-ctype \ php7-curl # configure interactive shell WORKDIR /xxx COPY . . ARG xxx_version=v??? ENV PATH=/xxx/xxx.bin:${PATH} CMD ["bash"]

只需要在COPY . .之前的一个RUN指令的前面加上一行:

ARG BREAKCACHE_VER=unknown

即可解决问题。(注意: 不能直接加在COPY . .前面,需要加在RUN指令的前面)

添加指令后的文件内容:

RUN apk update \ \ # Install Python && apk add \ py3-psutil \ python3 \ yaml-dev # Setup environment ARG BREAKCACHE_VER=unknown #加在这里即可 RUN apk update \ \ # Install PHP && apk add \ php7 \ php7-ctype \ php7-curl # configure interactive shell WORKDIR /xxx COPY . . ARG xxx_version=v??? ENV PATH=/xxx/xxx.bin:${PATH} CMD ["bash"]

然后运行:

docker build --build-arg BREAKCACHE_VER=$(date +%Y%m%d-%H%M%S) -f docker/Dockerfile .

即可顺利地从RUN apk update \那一步开始构建 (注意: 这里多了一个 -f 参数,是因为没有这个的话,COPY . .还是会拷贝docker文件夹下的文件,而非这个项目的文件)。从而省去了前面的steps,节省了一些时间。

补充 2020年9月3日13:07:34

还有更快的小trick。 如下:

RUN apk update \ \ # Install Python && apk add \ py3-psutil \ python3 \ yaml-dev # Setup environment #ARG BREAKCACHE_VER=unknown #不加在这里,因为加在这里还是会运行RUN apk update这些,很麻烦 RUN apk update \ \ # Install PHP && apk add \ php7 \ php7-ctype \ php7-curl # 加在这里,并且整一个简单的RUN指令,这样就可以直接运行COPY . . 啦,十分方便 ARG BREAKCACHE_VER=unknown RUN pwd # configure interactive shell WORKDIR /xxx COPY . . ARG xxx_version=v??? ENV PATH=/xxx/xxx.bin:${PATH} CMD ["bash"]

小结

主要参考:

rebuild docker image from specific step 里面原理大概就是利用这个docker 的 ARG,来清除指定的、构建过程中产生的cache,从而达到从某一步开始构建的目的。
最新回复(0)