【问题标题】:Dockerfile COPY instruction failing?Dockerfile COPY 指令失败?
【发布时间】:2021-02-03 20:50:46
【问题描述】:

所有,我正在尝试将文件从我的主机永久复制到映像,以便这些文件可用于基于该映像启动的每个容器。作为 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 在那里(猫显示),我所有更改路径(相对、绝对等)的尝试都失败了。有什么建议为什么这个简单的任务有问题?

【问题讨论】:

  • 使用 mkdir,您可以使用 -p 选项一次性创建它们:mkdir -p /octave/libs/jsonlab
  • 而且前3行也应该合并成一个RUN

标签: docker dockerfile


【解决方案1】:

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

【讨论】:

  • 工作!我已将该文件复制到与 Dockerfile 相同的目录中,并且对目标文件夹非常小心(必须有反斜杠,但“/。”因为目标文件失败)。看来docker对这个操作很挑剔..
  • 奇怪的是,使用源文件的显式路径对我不起作用——即使它与 Dockerfile 位于同一位置。我删除了源文件的路径,它起作用了。
  • 我一直在纠结这个问题,Docker,你为什么人为地让我们的生活变得困难?文件在那里,路径是正确的,为什么这不起作用?说真的,还有很多其他真正的问题需要解决,为什么要实施如此容易出错的东西?
  • 始终确保在复制之前添加 WORKDIR WORKDIR /home/user COPY ./ .
【解决方案2】:

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

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

【讨论】:

  • 这是我的情况,我正在处理一个旧项目,我意识到我在 .dockerignore 中有一个“*”规则,非常感谢
  • docker ignore just bit me too,谢谢你的信息。
  • 现在连续搜索了 3 个小时,我想我疯了,为什么它会拒绝复制任何东西。谢谢!
【解决方案3】:

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

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

以递归方式处理上下文。因此,PATH 包含所有子目录。

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

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

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

【讨论】:

  • 我不明白上下文的含义。不,它不会发送整个 / 目录,为什么要这样做?当您构建映像时,它不会自动复制所有文件,它会复制您明确复制的文件。我目前无法复制一个文件,更不用说复制了。它总是抛出错误信息,拒绝执行docker文件中的复制命令,非常令人沮丧。
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

    我通过首先检查上下文是什么来让它工作的, 在源文件之前设置绝对路径 您的 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

    迈克尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 2015-10-10
      相关资源
      最近更新 更多