目录
WORKDIR /app
COPY record .?
RUN cd record && xxx
执行到RUN时报了错: /bin/sh: 1: cd: can't cd to /app/record
并且宿主机当前目录也准备好了record目录,此目录下有三个文件。
目的是拷贝record目录本身(包含了其子文件夹和子文件)到当前路径下,结果拷贝成了record下的所有文件直接放到了当前路径。
为了验证当前目录下record到底有哪些东西,打印一下看看:
RUN ls -al ./record ? ?
结果也报错:
ls: cannot access './record': No such file or directory
说明确实没有 record 这个目录。
然后把 RUN ls -al record ?改成 ?RUN ls -al . 直接看当前目录,最终才发现端倪,在执行COPY record .这一行时,实际上是把record目录下的所有内容拷贝到了当前目录(而不是把record)
也就是说在执行COPY后当前目录下是record下三个文件,因此cd record或ls命令查看record当然不会成功了。
举个例子,在某个机器上某目录下有两个文件夹:
./aaa/hello
./bbb
上面出问题时的拷贝情形等价于
cp -r aaa/* bbb
而不是
cp -r aaa bbb ?或 ?cp -r aaa/ bbb
在Dockerfile中COPY并不支持直接将源路径(目录)作为一个整体移动或复制到新路径,它仅能复制源路径下的内容。
如果要实现后者,则 可以直接将源路径换成.? 即:
COPY .? 目标路径
或使用cp 命令完成:
RUN cp -r record .
因此为避免这种不存在的路径问题出现,就要保证拷贝到合适的位置、并且后续的命令处理也是正确的位置。
如果此类文件和路径问题总出现,建议多打印ls看看。
在执行构建时加如下参数:
--progress=plain --no-cache