【问题标题】:How to copy file from host to container using Dockerfile如何使用 Dockerfile 将文件从主机复制到容器
【发布时间】:2015-08-07 22:04:51
【问题描述】:

我写了一个看起来像这样的 Dockerfile

FROM ubuntu:12.04

RUN apt-get update
RUN apt-get install -y wget

现在我的主机中有一个名为abc.txt 的文件。我怎样才能将它复制到这个容器。我可以在 Dockerfile 中添加从主机复制到容器的任何步骤。

【问题讨论】:

标签: docker boot2docker dockerfile docker-registry


【解决方案1】:

像这样使用 COPY 命令:

COPY foo.txt /data/foo.txt
# where foo.txt is the relative path on host
# and /data/foo.txt is the absolute path in the image

official documentation中阅读有关COPY的更多详细信息

另一种方法是使用 ADD,但如果您不想使用 ADD 的某些高级功能(例如解压缩 tar.gz 文件),这不是最佳做法。如果您仍想使用 ADD 命令,请这样做:

ADD abc.txt /data/abc.txt
# where abc.txt is the relative path on host
# and /data/abc.txt is the absolute path in the image

official documentation阅读更多关于添加的详细信息

【讨论】:

  • 有没有可能使用主机的绝对路径来做到这一点?
  • 很遗憾,不能,您只能从 Dockerfile 的文件夹或其子文件夹中添加文件。此外,软链接也不起作用。这是由于 docker 构建过程。构建首先将 Dockerfile 所在的目录压缩为存档,并使用此存档来检索 ADD/COPY 命令中使用的文件。
  • 谢谢,我写了一个shell脚本来自动化这部分。如果我能通过 Dockerfile 来处理就更好了。
【解决方案2】:

对于那些得到这个(非常不清楚)错误的人:

复制失败:stat /var/lib/docker/tmp/docker-builderXXXXXXX/abc.txt:没有这样的文件或目录

可能有很多原因,包括:

  • 对于 docker-compose 用户,请记住 docker-compose.yml context 会覆盖 Dockerfile 的上下文。您的 COPY 语句现在需要导航相对于 docker-compose.yml 中定义的路径,而不是相对于 Dockerfile。
  • COPY 行尾随 cmets 或分号:COPY abc.txt /app #This won't work
  • 文件位于被.dockerignore.gitignore 文件忽略的目录中(注意通配符)
  • 你打错字了

有时WORKDIR /abc 后跟COPY . xyz/COPY /abc xyz/ 失败的情况下工作,但它有点难看。

【讨论】:

  • 添加到这个——如果你在pycharm中移动一个Dockerfile,它可以自动改变上下文。
  • 啊谢谢!在我的 Dockerfile 中发现了一个讨厌的 .gitignore,它阻止了 ADD foo.zip .
  • 谢谢!对我来说,问题是.gitignore
【解决方案3】:

我遇到了这个问题,我无法将 zeppelin [1GB] 目录复制到 docker 容器中并且遇到了问题

复制失败:统计 /var/lib/docker/tmp/docker-builder977188321/zeppelin-0.7.2-bin-all: 否 这样的文件或目录

我使用的是 docker 版本:17.09.0-ce,并通过以下步骤解决了问题。

第1步:复制zeppelin目录[我想复制到docker包中]到包含“Dockfile”的目录中

第 2 步:编辑 Dockfile 并添加命令 [我们要复制的位置] ADD ./zeppelin-0.7.2-bin-all /usr/local/

第 3 步:进入包含 DockFile 的目录并运行命令 [也可以使用替代方法]docker build

第 4 步:使用日志成功创建 docker 映像

步骤 5/9:添加 ./zeppelin-0.7.2-bin-all /usr/local/ ---> 3691c902d9fe

第 6/9 步:WORKDIR $ZEPPELIN_HOME ---> 3adacfb024d8 .... 成功构建b67b9ea09f02

【讨论】:

  • 这里重要的一步是文件必须与 Dockerfile 位于同一文件夹中
【解决方案4】:

我在 CentOS 7 上使用 Docker 19.03.8 时遇到以下错误:

COPY failed: stat /var/lib/docker/tmp/docker-builderXXXXXXX/abc.txt: no such file or directory

解决方案对我来说是使用 docker build . 而不是 docker build - < Dockerfile 从 Docker 文件构建。

【讨论】:

    【解决方案5】:
    【解决方案6】:

    我能够将文件从主机复制到 dockerfile 中的容器,如下所示:

    1. 在我的 c 驱动程序上创建了一个文件夹 --> c:\docker
    2. 在同一个文件夹下创建一个测试文件 --> c:\docker\test.txt
    3. 在同一个文件夹下创建一个docker文件--> c:\docker\dockerfile
    4. docker文件的内容如下,将文件从本地主机复制到容器的根目录: FROM ubuntu:16.04

      复制 test.txt /

    5. 从 docker hub 拉取一份 ubuntu --> docker pull ubuntu:16.04
    6. 从 dockerfile 构建镜像 --> docker build -t myubuntu c:\docker\
    7. 从你的新镜像 myubuntu 构建容器 --> docker run -d -it --name myubuntucontainer myubuntu "/sbin/init"
    8. 连接到新创建的容器 -->docker exec -it myubuntucontainer bash
    9. 检查text.txt文件是否在根目录 --> ls

    您应该会看到该文件。

    【讨论】:

      【解决方案7】:

      如果要复制当前目录的内容,可以运行:

      docker build  -t <imagename:tag> -f- ./ < Dockerfile
      

      【讨论】:

        猜你喜欢
        • 2018-11-22
        • 2016-01-27
        • 2018-09-13
        • 2018-08-29
        • 2021-05-24
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        相关资源
        最近更新 更多