在我的 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?
对我来说,该目录位于正确的上下文中,只是它包含在
.dockerignore
项目根目录的(隐藏)文件中。这会导致错误消息:从文档中:
当您使用时,您使用
/srv/visitor
的是构建上下文之外的绝对路径,即使它实际上是当前目录。你最好像这样组织你的构建上下文:
并使用:
笔记:
docker build - < Dockerfile
没有任何上下文。因此使用,
docker build .
对我来说,问题是我正在使用
docker build - < Dockerfile
来自文档 注意:如果您使用 STDIN (
docker build - < somefile
) 构建,则没有构建上下文,因此无法使用 COPY。我遇到了这个问题,发现我能够向构建变量添加一个上下文,以便从其他目录加载我的 Dockerfile。这让我可以根据自己的喜好更改我的默认 Docker 文件结构。这是我的 docker-compose.yml 中的一个片段:
通过添加上下文,我能够定义应该引用文件的位置。您可以在此处参考 Docker 文档:https ://docs.docker.com/compose/compose-file/#context
希望这可以帮助!
正如 Xavier Lucas [非常有用] 的回答所说,您不能从构建上下文之外的目录中使用 COPY 或 ADD(您运行“docker build”的文件夹应该与您的 .Dockerfile 目录相同)。即使您尝试使用符号链接,它也不起作用。
这对我有用。cp -al 复制目录结构并为所有文件建立硬链接。完成后运行“rm -rf ./src_directory”将其删除。
对于以下错误,
我通过重新启动 docker 服务解决了这个问题。
对我来说,问题是我添加的文件名有一个尾随空格。重命名修复了它。
在我的案例中,我终于解决了这个问题,执行复制的 Dockerfile 位于项目的更深层次。所以我意识到主机的构建路径是相对于 Dockerfile 的文件位置表示的。
当我尝试从不同的目录运行 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
.起初它觉得很奇怪,因为当我
Dockerfile
在应用程序根目录中有它时它工作正常。如果您想更好地管理环境 docker 文件,这将有所帮助。该文件不仅必须位于当前构建上下文中的目录中,而且该文件也不能是指向构建上下文之外的文件的软链接。
我的主目录中有一个文件的链接,该链接位于项目目录中。在我删除链接并将链接文件移动到项目(
rm mylink ; mv ~/myrealfile ./
)之后,它就可以工作了。