如题,我在用dockerfile构建镜像的时候在Step 14/16的时候出现了问题,我不想重新开始构建,因为太费时间,所以想尝试回退到某一步。在此记录解决方案。
运行指令: 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。 如下讲述具体解决方案。
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,节省了一些时间。
还有更快的小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,从而达到从某一步开始构建的目的。