27

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

Dockerfile 相当简单(安装 octave 映像):

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 在那里(猫显示),我所有更改路径(相对、绝对等)的尝试都失败了。任何建议为什么这个简单的任务是有问题的?

4

5 回答 5

22

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

于 2015-01-21T01:00:42.720 回答
21

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

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

于 2015-01-21T01:05:36.983 回答
8

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

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

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

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

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

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

于 2017-05-06T09:17:37.437 回答
3

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

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

  2. 检查.dockerignore以确保您没有忽略要复制的文件。

于 2020-10-17T16:03:10.673 回答
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 的家务,在下次访问(或)之前删除你的文件。

高温高压

迈克尔

于 2021-02-03T12:50:46.760 回答