复制Dockerfile中的文件,没有这样的文件或目录?

时间:2015-10-07 16:09:13

标签: docker

我在root(〜)文件夹中设置了Dockerfile。我文件的前三行看起来像这样:

COPY file1 /root/folder/
COPY file2 /root/folder/
COPY file3 /root/folder/

但它为每一行返回以下错误:

  

没有这样的文件或目录

这些文件与我的Dockerfile位于同一目录中,我也在终端的同一目录中运行命令docker build - < Dockerfile

我到底做错了什么?

21 个答案:

答案 0 :(得分:105)

请检查.dockerignore文件。

我知道这是一个非常罕见的案例,但我在那里提到了那个文件。

答案 1 :(得分:16)

这可能是由于您将file1 / file2 / file3称为绝对路径而不是构建上下文,Docker仅在构建上下文中搜索路径。

E.g。如果您使用COPY / home / yourname / file1,则Docker构建会将其解释为$ {docker build working directory} / home / yourname / file1,如果此处没有相同名称的文件,则不会抛出文件或目录错误。

请参阅One of the docker issue

答案 2 :(得分:11)

Dockerfile中的COPY指令将src中的文件复制到dest文件夹。您似乎错过了file1file2file3,或者尝试从错误的文件夹构建Dockerfile

Refer Dockerfile Doc

构建Dockerfile的命令也应该是这样的。

cd into/the/folder/
docker build -t sometagname .

答案 3 :(得分:10)

似乎命令:

docker build -t imagename .

和:

docker build -t imagename - < Dockerfile2

不会以同样的方式执行。如果要使用Dockerfile和Dockerfile2在一个文件夹中构建2个泊坞窗图像,则在使用stdin(&lt; Dockerfile2)的第二个示例中不能使用COPY命令。 相反,你必须使用:

docker build -t imagename -f Dockerfile2 .

然后COPY按预期工作。

答案 4 :(得分:4)

尝试从其他目录运行docker文件时,发生了这种情况。

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

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

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

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

一开始发现它很奇怪,因为当我在apps根目录中有Dockerfile时,它运行正常。如果您想要更好地管理环境泊坞文件,这将有所帮助。

答案 5 :(得分:3)

这是解决方案和最佳实践:

您需要创建一个资源文件夹,在其中可以保留所有要复制的文件。

├── Dockerfile
│   └── resources
│       ├── file1.txt
│       ├── file2.js

用于复制文件的命令应通过以下方式指定:

COPY resources /root/folder/

其中

*资源-您在与Dockerfile相同的文件夹中创建的本地文件夹

* / root / folder / -容器中的文件夹

答案 6 :(得分:2)

在 PS 上执行 docker build - < DockerfileGet-Content .\Dockerfile | Docker build - 可能无法获取上下文。我建议你使用

Docker build -f .\Path\Dockerfile . 

答案 7 :(得分:2)

我知道这很老了,但要指出一点。如果您认为一切正常,请检查.gitignore文件:)

您可能在本地拥有该文件夹,但是如果该文件夹位于您的git中,则忽略它,然后不在服务器上,这意味着Docker无法找到该文件夹​​,因为该文件夹不存在。

答案 8 :(得分:1)

先前对COPY的调用可能正在更改目录。

COPY ./server/package.json ./server      # this passes, but the dest ./server is considered a file

COPY ./server/dist ./server/dist         # error, ./server/dist is not a directory

在第一个通话中添加斜杠

COPY ./server/package.json ./server/

答案 9 :(得分:1)

我刚刚遇到了这个问题,这里没有任何建议可以解决我的问题。 事实证明我的文件中我的行尾错误,并且不得不将它们更改为适当的行尾。 (在这种情况下,从CRLF到LF,因此Ubuntu 14.04可以识别我在Windows上进行编辑的脚本。)

我使用VSCode更改了行尾,大多数代码编辑器应该可以选择行尾。

希望这对某人有帮助。

答案 10 :(得分:1)

使用Docker put_archive找不到文件错误。我正在使用Python API for docker。 Docker版本1.12.5,build 7392c3b

docker.errors.NotFound: 404 Client Error: Not Found ("lstat /var/lib/docker/aufs/mnt/39d58e00519ba4171815ee4444f3c43d2c6a7e285102747398f6788e39ee0e87/var/lib/neo4j/certificates: no such file or directory")

我无法将文件复制到创建的docker容器中。

con = cli.create_container(...)
cli.put_archive(...)
cli.start(con['Id'])

如果我改变操作顺序,则没有错误,文件被完全复制到我想要的位置。所以我知道我的代码正在运行并按照我的意愿去做。但重要的是在配置文件启动之前将其复制到容器中。在开始之后复制文件会使容器以默认配置启动,而不是在启动容器之前需要复制到位的自定义配置。 Docker声称此问题已关闭但仍影响我的应用程序。

这有效;相同的代码执行顺序不同。

con = cli.create_container(...)
cli.start(con['Id'])
cli.put_archive(...)

答案 11 :(得分:1)

我遇到了这个。复制某些目录无效。复制文件了。原来是因为.gitignore(不仅仅是.dockerignore)中包含的文件也被忽略了。参见:https://github.com/zeit/now/issues/790

答案 12 :(得分:1)

相似,感谢

之后tslegaitis的回答
gcloud builds submit --config cloudbuild.yaml . 

它显示

Check the gcloud log [/home/USER/.config/gcloud/logs/2020.05.24/21.12.04.NUMBERS.log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).

检查该日志,它显示docker将使用.gitignore

DATE Using default gcloudignore file:
# This file specifies files that are *not* uploaded to Google Cloud Platform
# using gcloud. It follows the same syntax as .gitignore, with the addition of
# "#!include" directives (which insert the entries of the given .gitignore-style
# file at that point).
# ...

.gitignore

所以我修复了.gitignore(我将其用作白名单),然后docker复制了该文件。

[我添加了答案,因为我没有足够的声誉来发表评论]

答案 13 :(得分:1)

即使我的源目录位于正确的构建上下文中,我仍然遇到此问题。发现原因是我的源目录是到构建上下文外部位置的符号链接。

例如,我的Dockerfile包含以下内容:

COPY dir1 /tmp

如果dir1是符号链接,则COPY命令在我的情况下不起作用。

答案 14 :(得分:1)

我觉得有点愚蠢,但我的问题是我正在运行docker-compose,而我的Dockerfile位于./deploy子目录中。我的ADD引用需要相对于项目的根目录,而不是Dockerfile。

更改: ADD ./file.tar.gz / etc / folder / 至: 添加./deploy/file.tar.gz / etc / folder /

无论如何,如果有人遇到同样的问题,我会发帖子。

答案 15 :(得分:0)

如果您确定自己做了正确的事情,但码头工作者仍抱怨,请查看此问题:https://github.com/moby/moby/issues/27134
我被这个烧了,似乎重新启动docker引擎service docker restart只会解决这个问题。

答案 16 :(得分:0)

我正在寻找修复此问题,我在ADD或COPY'ing的文件夹不在构建文件夹,上面的多个目录或从/

引用

将构建文件夹外部的文件夹移动到构建文件夹中解决了我的问题。

答案 17 :(得分:0)

不使用stdin并保持上下文的方法之一是:

1)在Dockerfile中,你应该添加

ADD /your_dir_to_copy /location_in_container

2)之后,你应该继续使用/ your_dir_to_copy目录的父目录

2)然后运行此命令

sudo docker build . -t (image/name) -f path_of_your_dockerfile/Dockerfile

3)创建容器后

docker run -ti --rm cordova bash

4)您将目录复制到容器中

答案 18 :(得分:0)

因此,最近才发生过几次。作为一个.Net开发人员,我使用VisualStudio将我的内部版本名称从SomeThing更改为Something作为DLL名称,但这不会更改保留SomeThing.csproj

的.csproj文件。

Dockerfile使用区分大小写的Linux文件名,因此新自动生成的Dockerfile试图复制Something.csproj找不到的文件。因此,手动重命名该文件(使其变为小写)就可以正常工作

但是...这是一个警告。我的Windows笔记本电脑上的文件名更改没有被Git接收,因此回购源仍在回购中SomeThing.csproj,并且在CI / CD流程中,出于相同的原因Docker构建失败...

作为回购协议上的提交,我不得不直接更改文件名。。

tl; dr如果在Windows O / S上检查文件名是否区分大小写,并注意本地文件重命名不会随着Git更改而被获取,因此请确保如果使用CI / CD,您的存储库也已修改

答案 19 :(得分:0)

对于以下错误,

COPY failed: stat /<**path**> :no such file or directory

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

sudo service docker restart

答案 20 :(得分:0)

这里已经有一些不错的答案。对我有用的是将注释移到下一行。

WORKDIR /tmp/app/src # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/ # copy the project source code

WORKDIR /tmp/app/src
  # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/
  # copy the project source code