Dockerfile COPY指令失败了吗?

时间:2015-01-21 00:53:50

标签: docker dockerfile

全部,我正在尝试将文件从我的主机持久复制到图像,以便这些文件可用于基于该图像启动的每个容器。在debian wheezy 64bit上作为virtualbox guest运行。

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 

Docker绝对拒绝将此文件从主机复制到映像中。不用说文件loadjson.m就在那里(cat显示),我所有改变路径的尝试(相对,绝对等)都失败了。有什么建议为什么这个简单的任务有问题?

5 个答案:

答案 0 :(得分:17)

在我最初写这篇文章时,Docker没有扩展〜或$ HOME。现在它在构建上下文中进行了一些扩展,但即便如此,它们可能不是您想要的 - 它们不是您在上下文之外的主目录。您需要显式引用该文件,或者相对于Dockerfile本身打包它。

答案 1 :(得分:10)

Docker只能复制上下文中的文件,你所在的文件夹减去dockerignore文件中列出的任何文件。

运行“docker build”时,docker会分析上下文并将其发送到您连接的docker守护程序。它只允许您在上下文中复制文件,因为守护程序可能是远程计算机。

答案 2 :(得分:5)

在理解上下文之前我无法让COPY工作(我试图从上下文之外复制文件)

  

docker build命令从Dockerfile和上下文构建映像。构建的上下文是指定位置PATH处的文件。 PATH是本地文件系统上的目录。

     

递归处理上下文。因此,PATH包含任何子目录。

     

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

     

警告:不要将根目录/用作PATH,因为它会导致构建将硬盘驱动器的全部内容传输到Docker守护程序。

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

答案 3 :(得分:1)

我有类似的问题。我通过检查两件事解决了它:

  1. 在服务的docker-compose.yaml检查context中,docker将不会在该目录之外复制任何文件。例如,如果contextapp/,那么您将无法复制../app

    中的任何内容
  2. 选中.dockerignore,以确保您没有忽略要复制的文件。

答案 4 :(得分:0)

我通过首先检查上下文来让它工作, 在源文件之前设置绝对路径 您的 Dockerfile 以获取该信息:

# grep COPY Dockerfile
COPY /path/to/foo   /whatever/path/in/destination/foo

以此构建:

docker build -t bar/foo .

你会得到一个错误,它指出了 Docker 的上下文路径 显然正在寻找它的文件,例如 结果是:

/var/lib/docker/tmp      # I don't remember

复制(!)您在该目录中的一组构建文件(此处:/var/lib/docker/tmp), cd 进去,从那里开始构建。

看看这是否有效,不要忘记做一些内务清理工作 tmp,在下次访问(或)之前删除您的文件。

HTH

迈克尔