Docker COPY 问题-“没有这样的文件或目录”

Docker COPY 问题-“没有这样的文件或目录”

在我的 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?

答案1

来自文档:

路径<src>必须在构建上下文中;您不能 COPY ../something /something,因为 docker build 的第一步是将上下文目录(和子目录)发送到 docker 守护进程。

当您使用时,/srv/visitor您正在使用构建上下文之外的绝对路径,即使它实际上是当前目录。

您最好像这样组织您的构建上下文:

├── /srv/visitor
│   ├── Dockerfile
│   └── resources
│       ├── visitor.json
│       ├── visitor.js

并使用:

COPY resources /srv/visitor/

笔记:

docker build - < Dockerfile没有任何上下文。

因此使用,

docker build .

答案2

对我来说,目录处于正确的上下文中,只是它包含在.dockerignore项目根目录中的 (隐藏) 文件中。这导致错误消息:

lstat mydir/myfile.ext: no such file or directory

答案3

对我来说,问题是我正在使用docker build - < Dockerfile

来自文档 注意:如果使用 STDIN ( docker build - < somefile) 进行构建,则没有构建上下文,因此无法使用 COPY。

答案4

正如 Xavier Lucas [非常有帮助] 的回答所述,您不能从构建上下文之外的目录使用 COPY 或 ADD(您运行“docker build”的文件夹应该与您的 .Dockerfile 位于同一目录)。即使您尝试使用符号链接,它也不会起作用。

注意:这特定于 POSIX(Linux、Unix、Mac、可能是 Windows 的 Linux 子系统)。您可能能够在 Windows 中使用 JUNCTION 执行类似操作。

cd ~/your_docker_project/
cp -al /subfolder/src_directory ./
echo "COPY src_directory /subfolder/" >> Dockerfile

危险:使用此功能将使您的 docker 项目特定于主机。您几乎永远不想这样做!请小心处理。

应用:在开发环境中学习、实验

这对我来说很管用。cp -al 复制目录结构并为所有文件创建硬链接。完成后,运行“rm -rf ./src_directory”将其删除。

相关内容