Dockerfile COPY 指令失败?

Dockerfile COPY instruction failing?

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

Docker文件相当简单(安装八度图像):

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

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

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

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

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

The docker build command builds an image from a Dockerfile and a context. The build’s context is the files at a specified location PATH. The PATH is a directory on your local filesystem.

A context is processed recursively. So, a PATH includes any subdirectories.

The build is run by the Docker daemon, not by the CLI. The first thing a build process does is send the entire context (recursively) to the daemon. In most cases, it’s best to start with an empty directory as context and keep your Dockerfile in that directory. Add only the files needed for building the Dockerfile.

Warning: Do not use your root directory, /, as the PATH as it causes the build to transfer the entire contents of your hard drive to the Docker daemon.

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

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

  1. 在你里面,docker-compose.yaml勾选context的服务,docker不会复制这个目录外的任何文件。例如,如果 contextapp/ 那么您不能从 ../app

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

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

# 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

迈克尔