在 Dockerfile 中拷贝一个文件,没有这样的文件或目录吗?

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

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

但每行返回以下错误:

没有这样的文件或目录

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

我到底做错了什么?

264296 次浏览

Dockerfile中的 COPY 指令将 src中的文件复制到 dest文件夹。看起来你要么是错过了 file1file2file3或试图从错误的文件夹构建 Dockerfile

参考 Dockerfile 文档

另外,构建 Dockerfile的命令应该类似于。

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

看来命令是:

docker build -t imagename .

以及:

docker build -t imagename - < Dockerfile2

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

docker build -t imagename -f Dockerfile2 .

然后,COPY 将按预期工作。

也要检查 .dockerignore文件。

我知道这是一个非常罕见的情况下,但我有文件提到那里。

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

例如,如果使用 COPY /home/yourname/file1,Docker build 将其解释为 ${docker build working directory}/home/yourname/file1,如果这里没有同名文件,则不会抛出文件或目录错误。

请参阅 码头的问题之一

我觉得自己有点傻,但我的问题是,我正在运行 Docker-Comose,而我的 Dockerfile 是在一个。/部署子目录。我的 ADD 引用需要相对于项目的根,而不是 Dockerfile。

改变: ADD./file.tar.gz/etc/file/ 致: ADD./department/file.tar.gz/etc/file/

不管怎样,我觉得我应该发个帖子,以防有人碰到同样的问题。

由于以下错误,

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

我通过重新启动码头服务来解决这个问题。

sudo service docker restart

在 Docker put _ archive 中找不到文件错误。 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(...)

运行 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导致了这个问题。

一开始我觉得很奇怪,因为当我在 apps 根目录中使用 Dockerfile时,它工作得很好。如果您希望更好地管理环境 docker 文件,这将有所帮助。

如果你确信你做了正确的事情,但是 Docker 仍然抱怨,看看这个问题: https://github.com/moby/moby/issues/27134
我被这个烧伤,它似乎重新启动码头引擎 service docker restart只会解决这个问题。

我正在寻找一个修复这和文件夹我是 ADD 或 COPY’ing 不在构建文件夹,多个目录以上或从/引用

将文件夹从生成文件夹外部移动到生成文件夹中修复了我的问题。

不使用 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)在你将你的目录复制到你的容器之后

以前对 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/

我只是经历了这个问题,这里的建议没有一个解决了我的问题。 原来 我的台词结尾不对在我的文件,并不得不改变他们到适当的行结束。(在这种情况下,从 CRLF 到 LF,所以 Ubuntu 14.04会识别脚本,我一直在窗口编辑。)

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

希望这对谁有帮助。

以下是解决方案和最佳实践:

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

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

复制文件的命令应该这样指定:

COPY resources /root/folder/

哪里

* abc 0-您在 Dockerfile 所在的同一文件夹中创建的本地文件夹

* /根/文件夹/-文件夹在您的容器

我碰到了这个。复制一些目录不起作用。是复制文件。原来是因为。吉蒂诺尔(不仅仅是。也会被忽略。见: https://github.com/zeit/now/issues/790

这种情况最近发生过几次。作为一个。Netdev,使用 VisualStudio 我将构建名称从 SomeThing改为 Something作为 DLL 名称,但这并不改变。Csproj 文件,保留 SomeThing.csproj

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

但是... 这里有一个警告。我的 Windows 笔记本电脑上的这个文件名的变化没有得到 Git 拾取,所以回购源仍然是 SomeThing.csproj的回购和在 CI/CD 过程中,Docker 构建失败的原因相同..。

我不得不改变文件名直接作为一个回购提交... 。讨厌的小变通,但让我去

博士如果在 Windows 操作系统上检查文件名大小写敏感性,并注意本地文件重命名不会在 Git 更改时被检测到,所以如果使用 CI/CD,请确保您的回购文件也被修改

我知道这很旧了,但是有些事情要指出来。如果你认为一切都是它应该的,检查你的。Gitignore 文件:)

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

类似的,感谢 Tlegaitis的回答,之后

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 复制了这个文件。

[我加上这个答案是因为我没有足够的声誉来发表评论]

即使我的源目录在正确的构建上下文中,我也会遇到这个问题。原因是我的源目录是一个符号链接,指向构建上下文之外的位置。

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

COPY dir1 /tmp

如果 dir1是一个符号链接,那么在我的例子中,COPY命令不起作用。

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

Docker build -f .\Path\Dockerfile .

问题在于:

如果使用 STDIN (docker build-< some file)进行生成,则没有 构建上下文,因此不能使用 COPY

更多信息: https://docs.docker.com/engine/reference/builder/#copy

只要这样建造码头:

docker build -t name-of-your-tag .

我自己也遇到了这种情况,这里的解决方案都不管用。

最后,原因是我在构建 容器/名称并运行之前构建的 容器/名称: 1.0

换句话说,检查您构建和运行的容器是否完全相同。