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


99

我的根(〜)文件夹中设置了一个Dockerfile。我文件的前三行如下所示:

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

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

无此文件或目录

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

我到底在做什么错?


我遇到了这个问题,然后注意到.dockerignore文件忽略了我要复制的文件。jinschubert的解决方案:github.com/docker/for-mac/issues/1922
JStrahl

Answers:


36

在复制指令Dockerfile副本中的文件srcdest文件夹。像你看起来是丢失了file1file2并且file3还是试图建立Dockerfile从错误的文件夹。

参考Dockerfile文档

此外,用于构建的命令Dockerfile应类似。

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

3
第二个命令对我来说失败了,说“ build”需要一个参数。
GreenGodot 2015年

哦-立即更新cmd,无需提及Dockerfile。
askb 2015年

3
在正确阅读您的链接后,我发现DockerFile根本不应该位于根文件夹中。将所有内容移动到子目录,运行build命令,然后运行。您的回答最有帮助,因此我将其标记为正确。
GreenGodot 2015年

49
还要检查是否有(没有)Docker Ignore文件。
托尼

259

还要检查.dockerignore文件。

我知道这是一种非常罕见的情况,但是我在那儿提到了那个文件。


3
哦,天哪,谢谢你。我正在更改Java项目的名称(并因此更改了工件和build dir),并且ripgrep未在dotfile中搜索,因此没有看到对旧目录的最后一个讨厌的引用。
Martin Lehmann

4
感谢您的平视,在我的情况下,我正在为docker使用Visual Studio向导,并在第一行中添加了带*的.dockerignore :(
lacripta

由于某种原因,我的默认.dockerignore中带有** \ bin。我确定它是由Docker桌面生成的。
史蒂夫·史密斯

毕竟,ahhghgghghg似乎并不罕见!!!一百万年就不会弄清楚。不久前添加了目录,并且完全忘记了。添加它的原因是它使任何构建都非常慢,认为它与git有关……
tahiche

1
哦,严重的,那是一个错误。非常感谢您指出这一点!
taiBsu'5

37

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

例如,如果您使用COPY / home /您的名称/文件1,则Docker构建会将其解释为$ {docker构建工作目录} / home /您的名称/文件1,如果此处没有同名文件,则不会引发文件或目录错误。

请参阅Docker问题之一


存在某种绝对路径问题,我只能“ COPY relative / path / x”。我不能“复制/ absolute / path / y”,有人知道为什么吗?
亚历山大·米尔斯

8
@AlexanderMills Dockerfiles应该可以在主机上独立运行,并附带有相对于Dockerfile的路径中可用的其他文件。使用绝对路径将使其只能在您的计算机上运行。
kciesielski

那也是我的ADD指令问题,谢谢。
vmonteco

我不知道这个。对其进行更改,以使该文件与dockerfile一起包含在内,实际上对我来说效果很好。当我从其他某个源位置获得它时(例如,完整路径,例如/ dir / dir2 / file),它无法正常工作。如果它位于dockerfile的某个目录中或它的子目录中,则它可以工作
Newteq Developer

22

似乎命令:

docker build -t imagename .

和:

docker build -t imagename - < Dockerfile2

不会以相同的方式执行。如果要使用Dockerfile和Dockerfile2从一个文件夹内构建2个Docker映像,则在第二个示例中不能使用stdin(<Dockerfile2)使用COPY命令。相反,您必须使用:

docker build -t imagename -f Dockerfile2 .

然后,COPY会按预期工作。


17

运行正常docker build . -f docker/development/Dockerfile,它使您可以从应用程序的根目录以外的指定目录运行docker文件。

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

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

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

正是docker build docker/development/Dockerfile这导致了我这个问题。

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


1
docker build . -f docker/development/Dockerfile这行得通
Pradeep Surale

1
非常感谢您-这也对我有用。这让我发疯。
x0n

4

我刚刚遇到了这个问题,这里没有任何建议可以解决我的问题。原来我错了行结束我的文件,并有将其更改为相应的行尾。(在这种情况下,从CRLF到LF,因此Ubuntu 14.04可以识别我在Windows上进行编辑的脚本。)

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

希望这对某人有帮助。


是的,它确实有帮助:)
罗伯·史密斯

3

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

已更改:ADD ./file.tar.gz / etc / folder /更改为:ADD ./deploy/file.tar.gz / etc / folder /

无论如何,以为我会发布,以防有​​人遇到相同的问题。


3

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

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

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

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

COPY resources /root/folder/

哪里

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

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


2

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

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


1

对于以下错误,

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

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

sudo service docker restart

1

Docker put_archive文件未找到错误。我正在将Python API用于docker。Docker版本1.12.5,内部版本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(...)


1

我正在搜索此问题的修复程序,并且我为ADD或COPY'ing的文件夹不在构建文件夹中,上方多个目录或从/引用

将文件夹从构建文件夹外部移至构建文件夹解决了我的问题。


1

不使用stdin并保留上下文的一种方法是:

1)在您的Dockerfile中,您应该添加

ADD /your_dir_to_copy /location_in_container

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

2)然后运行此命令

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

3)创建容器后

docker run -ti --rm cordova bash

4)将目录复制到容器后


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/


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).

检查该日志,它说码头工人将使用.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复制了该文件。

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


1

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

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

COPY dir1 /tmp

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


0

因此,最近刚发生过几次。作为.Net开发人员,我使用VisualStudio将构建名称从SomeThing更改Something为DLL名称,但这不会更改保留的.csproj文件。SomeThing.csproj

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

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

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

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


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