2015-01-21 89 views
11

所有,我试图从我的主机持久复制文件到一个图像,以便这些文件可用于基于该图像启动的每个容器。在debian wheezy 64bit上作为virtualbox guest运行。Dockerfile COPY指令失败?

的Dockerfile相当简单(安装八度图像):

FROM debian:jessie 
MAINTAINER GG_Python <[redacted]@gmail.com> 
RUN apt-get update 
RUN apt-get update 
RUN apt-get install -y octave octave-image octave-missing-functions octave-nan octave-statistics 

RUN mkdir /octave 
RUN mkdir /octave/libs 
RUN mkdir /octave/libs/jsonlab 
COPY ~/octave/jsonlab/loadjson.m /octave/libs/jsonlab/. 

我发出编译命令后得到以下跟踪:docker build -t octave .

Sending build context to Docker daemon 423.9 kB 
Sending build context to Docker daemon 
Step 0 : FROM debian:jessie 
---> 58052b122b60 
Step 1 : MAINTAINER GG_Python <[..]@gmail.com> 
---> Using cache 
---> 90d2dd2f7ee8 
Step 2 : RUN apt-get update 
---> Using cache 
---> 4c72c25cd829 
Step 3 : RUN apt-get update 
---> Using cache 
---> b52f0bcb9f86 
Step 4 : RUN apt-get install -y octave octave-image octave-missing-functions octave-nan octave-statistics 
---> Using cache 
---> f0637ab96d5e 
Step 5 : RUN mkdir /octave 
---> Using cache 
---> a2d278b2819b 
Step 6 : RUN mkdir /octave/libs 
---> Using cache 
---> 65efbbe01c99 
Step 7 : RUN mkdir /octave/libs/jsonlab 
---> Using cache 
---> e41b80901266 
Step 8 : COPY ~/octave/jsonlab/loadjson.m /octave/libs/jsonlab/. 
INFO[0000] ~/octave/jsonlab/loadjson.m: no such file or directory 

泊坞窗决不肯将复制此文件从主机到图像。不用说loadjson.m文件在那里(猫显示),我所有的尝试改变路径(相对,绝对等)失败。任何意见为什么这个简单的任务是有问题的?

+0

使用mkdir您可以使用-p选项一气呵成创建它们的所有目录:mkdir -p /倍频程/库/ jsonlab – dalore 2017-12-21 11:32:48

+0

,也是第3行应结合进入一个RUN – dalore 2017-12-21 11:33:22

回答

11

Docker不会扩展〜或$ HOME。您可能需要显式引用该文件,或者将其与Dockerfile本身相关进行打包。

+0

作品!我已经将文件复制到Dockerfile所在的目录中,并且注意目标文件夹(必须有反斜杠,但“/。”作为目标文件失败)。 Docker似乎对这个操作非常挑剔.. – 2015-01-21 01:08:35

+1

奇怪的是,使用源文件的显式路径对我来说不起作用 - 即使它与Dockerfile位于相同的位置。我删除了源文件的路径,它工作。 – ben 2016-07-28 11:12:48

8

Docker只能从上下文中复制文件,您所在的文件夹中没有列出dockerignore文件中的任何文件。

当您运行'docker build'docker tars context时,它会将它发送到您连接的docker守护进程。它只允许您在上下文中复制文件,因为该守护程序可能是远程计算机。

+3

这是我的情况,我正在研究一个旧项目,我意识到我在'.dockerignore'中有一个“*”规则,非常感谢 – gsalgadotoledo 2017-05-03 14:57:15

3

我不能让COPY工作,直到我理解上下文(我试图将文件从上下文之外复制)

泊坞窗构建命令构建从Dockerfile和上下文的图像。构建的上下文是指定位置PATH处的文件。 PATH是本地文件系统上的一个目录。

递归处理上下文。所以,一个PATH包含任何子目录。

构建由Docker守护进程运行,而不是通过CLI运行。构建过程所做的第一件事是将整个上下文(递归地)发送到守护进程。在大多数情况下,最好以空目录作为上下文开始,并将Dockerfile保存在该目录中。仅添加构建Dockerfile所需的文件。

警告:不要使用根目录/作为PATH,因为它会导致构建将硬盘的整个内容传输到Docker守护进程。

参考: https://docs.docker.com/engine/reference/builder/#usage