Docker COPY问题-“没有这样的文件或目录”


36

在我的Dockerfile中,我有以下“ COPY”语句:

# Copy app code
COPY /srv/visitor /srv/visitor

不用说,在我的主机系统的“ / srv / visitor”目录下,确实存在我的源代码:

[root@V12 visitor]# ls /srv/visitor/
Dockerfile  package.json  visitor.js

现在,当我尝试使用此Dockerfile构建映像时,它在应该发生“ COPY”的步骤处挂起:

Step 10 : COPY /srv/visitor /srv/visitor
INFO[0155] srv/visitor: no such file or directory

它说没有这样的目录,但是显然有。

有任何想法吗?

更新1:

有人指出,以我理解构建上下文的方式,我错了。该建议等于将“ COPY”语句更改为:

COPY . /srv/visitor

问题是我是这样子的,构建过程在下一步停止了:

RUN npm install

当显然有一个文件时,它说的是“找不到package.json文件”。

更新2:

我尝试通过Dockerfile中的此更改运行它:

COPY source /srv/visitor/

尝试运行npm时它停止了:

Step 12 : RUN npm install
 ---> Running in ae5e2a993e11
npm ERR! install Couldn't read dependencies
npm ERR! Linux 3.18.5-1-ARCH
npm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"
npm ERR! node v0.10.36
npm ERR! npm  v2.5.0
npm ERR! path /package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno 34

npm ERR! package.json ENOENT, open '/package.json'
npm ERR! package.json This is most likely not a problem with npm itself.
npm ERR! package.json npm can't find a package.json file in your current directory.

npm ERR! Please include the following file with any support request:
npm ERR!     /npm-debug.log
INFO[0171] The command [/bin/sh -c npm install] returned a non-zero code: 34

那么,是否执行过复制?如果是,为什么npm无法找到package.json?


对于那些在2017年寻找问题的人-这可能是您的问题github.com/docker/for-mac/issues/1922。建议删除.dockerignore文件并重新测试。如果可行,您可以在.dockerignore中使用您的设置来解决此问题。
未定义,时间

Answers:


35

从文档中:

<src>路径必须构建的上下文中 ; 您无法复制../something / something,因为Docker构建的第一步是将上下文目录(和子目录)发送到docker守护程序。

当您使用/srv/visitor您使用,即使它实际上是当前目录下生成背景的绝对路径之外。

您最好像这样组织构建上下文:

├── /srv/visitor
│   ├── Dockerfile
│   └── resources
│       ├── visitor.json
│       ├── visitor.js

并使用:

COPY resources /srv/visitor/

注意:

docker build - < Dockerfile 没有任何上下文。

因此使用

docker build .


我已经在主机系统的“ / srv / visitor”目录中,所有我的源代码以及Dockerfile都在这里。我应该如何编写“ COPY”语句,以便将所有这些源复制到容器的“ / srv / visitor”目录中?
dsljanus 2015年

1
@dsljanus源目录或文件必须对于构建上下文即/srv/visitor目录。
哈维尔·卢卡斯

因此,应该是“。”吗?因为我有这种方式,所以构建过程在下一步“ RUN npm install”中停止了。它说了类似“未找到package.json文件”的内容。也请参阅我的更新。
dsljanus 2015年

2
@dsljanus那么您在哪里运行npm?发布您的整个dockerfile ...顺便说一句,不要在问题中修改这样的多个更新,将一个问题跳到一个完全不同的问题确实很烦人。SF的目的是发布明确的问题,以便获得明确的答案。
哈维尔·卢卡斯

1
@dsljanus好的,这就是问题所在,请不要使用,RUN cd而是使用,WORKDIR以便在每个步骤之间记住当前目录。dockerfile仅仅是docker run + docker commit的包装,因此每个步骤都在上一层独立运行。这意味着/如果您不使用此指令,则pwd 在每个步骤中均相等。
哈维尔·卢卡斯

39

对我而言,该目录位于正确的上下文中,只有它包含在.dockerignore项目根目录的(隐藏)文件中。这导致错误消息:

lstat mydir/myfile.ext: no such file or directory

3
你的意思是.dockerignore?只是发生在我身上
马丁·科尔

5
祝福你!我忘了拥有一个完整的目录,这破坏了我的构建。需注意的是,您可以使用以下命令取消忽略目录中的单个文件:!path/to/my/file即使path位于中.dockerignore
hjc1710

这个不错。
Gudlaugur Egilsson

无法表达我对您的感谢,在过去的一天中一直在折磨自己。仍然无法理解为什么VS Tools for docker在其中包含带有*的.dockerignore
bilal.haider

7

对我来说,问题是我正在使用 docker build - < Dockerfile

文档中 注意:如果使用STDIN(docker build - < somefile)进行构建,则没有构建上下文,因此无法使用COPY。


1

正如Xavier Lucas [非常有用]的回答所言,您不能在构建上下文之外的目录中使用COPY或ADD(从中运行“ docker build”的文件夹应与.Dockerfile位于同一目录)。即使您尝试使用符号链接,也无法使用。

注意:这特定于POSIX(Linux,Unix,Mac,Windows可能的Linux子系统)。您可以使用JUNCTION在Windows中执行类似的操作。

cd ~/your_docker_project/
cp -al /subfolder/src_directory ./
echo "COPY src_directory /subfolder/" >> Dockerfile

危险:使用此选项将使您的Docker项目特定于主机。您几乎永远都不想这样做!小心轻放。

应用:学习,在开发环境中进行实验

这对我有用。cp -al复制目录结构并为所有文件建立硬链接。完成后,运行“ rm -rf ./src_directory”将其删除。


我的目的:将本地文件系统上的缓存程序包复制到我的docker映像。安装我需要的工具(它将使用缓存或将其下载为新)。然后,我删除映像中的缓存并删除主机上的硬链接。如果主机没有这些文件,则无需担心。但是我的带宽有限,驱动器空间也有限。这是可以接受的用途吗?
TamusJRoyce

1

我遇到了这个问题,发现我能够向build变量添加上下文,以便从其他目录加载我的Dockerfile。这使我可以根据自己的喜好更改默认的Docker文件结构。这是我的docker-compose.yml中的片段:

version: '3'
services:
  webserver:
    build:
      context: .
      dockerfile: ./server/Dockerfile
    ...

通过添加上下文,我可以定义应在何处引用文件。您可以在此处引用Docker文档:https : //docs.docker.com/compose/compose-file/#context

希望这可以帮助!


0

对我来说,问题是我添加的文件名带有尾随空格。重命名修复了它。


0

对于以下错误,

COPY failed: stat

我通过重启docker服务解决了这个问题。


0

我最终解决了这个问题,我的案例是执行复制的Dockerfile位于项目的更深层。因此,我意识到主机的构建路径是相对于Dockerfile的文件位置表达的。


0

尝试从其他目录运行docker文件时,这发生在我身上。

我有,COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directory并通过指定docker文件设法解决了这一问题。

运行正常docker build . -f docker/development/Dockerfile

但是运行Runningdocker build docker / development / Dockerfile`导致了这个问题。

-f--file指定的名称和位置Dockerfile

起初它很奇怪,因为当我Dockerfile在apps根目录中有它时,它工作正常。如果您想更好地管理环境docker文件,这将有所帮助。


0

该文件不仅必须在当前构建上下文中的目录中,而且该文件也不能是到构建上下文外部文件的软链接。

我在主目录中有一个文件链接,而该链接在项目目录中。在删除链接并将链接的文件移至项目(rm mylink ; mv ~/myrealfile ./)后,它便开始工作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.