在我的 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”将其删除。