我在root(〜)文件夹中设置了Dockerfile。我文件的前三行看起来像这样:
COPY file1 /root/folder/
COPY file2 /root/folder/
COPY file3 /root/folder/
但它为每一行返回以下错误:
没有这样的文件或目录
这些文件与我的Dockerfile位于同一目录中,我也在终端的同一目录中运行命令docker build - < Dockerfile
。
我到底做错了什么?
答案 0 :(得分:105)
请检查.dockerignore
文件。
我知道这是一个非常罕见的案例,但我在那里提到了那个文件。
答案 1 :(得分:16)
这可能是由于您将file1 / file2 / file3称为绝对路径而不是构建上下文,Docker仅在构建上下文中搜索路径。
E.g。如果您使用COPY / home / yourname / file1,则Docker构建会将其解释为$ {docker build working directory} / home / yourname / file1,如果此处没有相同名称的文件,则不会抛出文件或目录错误。
答案 2 :(得分:11)
Dockerfile
中的COPY指令将src
中的文件复制到dest
文件夹。您似乎错过了file1
,file2
和file3
,或者尝试从错误的文件夹构建Dockerfile
。
构建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 - < Dockerfile
或 Get-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
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