如题,我在用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"]
主要参考: