如何使用Dockerfile将文件从主机复制到容器


76

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

FROM ubuntu:12.04

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

现在abc.txt,我的主机中有一个名为的文件。如何将其复制到此容器中。我可以在Dockerfile中添加从主机复制到容器的任何步骤吗?


顺便说一句,如果内存为我服务,wget已包含在Ubuntu 12.04中
user2915097 2015年

2
您的更新和安装可能应该放在一行上,请参阅docs.docker.com/articles/dockerfile_best-practices/#run
Henrik Karlsson

您要在docker映像中还是仅在docker容器中添加文件
Thomasleveil

Answers:


108

像这样使用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

官方文档中阅读有关COPY的更多详细信息

一种替代方法是使用ADD,但是如果您不想使用ADD的某些高级功能(如tar.gz文件的解压缩),那么这不是最佳实践。

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

官方文档中阅读有关ADD的更多详细信息


9
是否可以使用主机的绝对路径来执行此操作?
thenakulchawla

10
不幸的是,不能,您只能从Dockerfile文件夹或其子文件夹添加文件。此外,软链接也将不起作用。这是由于Docker构建过程造成的。构建过程是通过将Dockerfile所在的目录压缩到存档中开始,并使用该存档来检索ADD / COPY命令中使用的文件。
george.yord

谢谢,我写了一个shell脚本来自动化那部分。如果我可以通过Dockerfile处理它,那就更好了。
thenakulchawla

35

对于那些收到此(非常不清楚)错误的人:

COPY失败:stat /var/lib/docker/tmp/docker-builderXXXXXXX/abc.txt:无此类文件或目录

可能有很多原因,包括:

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

有时候,WORKDIR /abc其次是COPY . xyz/作品在那里COPY /abc xyz/失败了,但它是一个有点难看。


除此之外-如果您在pycharm中移动Dockerfile,它可以自动更改上下文。
马塞尔·威尔逊

啊,谢谢!发现一个讨厌的.gitignore一个问题是防止ADD foo.zip .在我Dockerfile。
哈希锁

5

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

COPY失败:stat /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


3
这里最重要的一步是事实的文件必须在同一文件夹中Dockerfile
bormat


1

在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文件构建docker build - < Dockerfile


0

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

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

    COPY test.txt /

  5. 从Docker中心提取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中

您应该看到该文件。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.