构建Dockerfile报错/bin/sh: 1: cd: can‘t cd to /xxx/yyy问题记录

发布时间:2024年01月04日

目录

关键的命令行

排查分析

原因

附:Dockerfile构建时打印命令输出的办法


关键的命令行

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看看

附:Dockerfile构建时打印命令输出的办法

在执行构建时加如下参数:

--progress=plain --no-cache

文章来源:https://blog.csdn.net/HYZX_9987/article/details/135348031
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。