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

Sas*_*ddi 60 docker boot2docker dockerfile docker-registry

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

FROM ubuntu:12.04

RUN apt-get update
RUN apt-get install -y wget
Run Code Online (Sandbox Code Playgroud)

现在我abc.txt在主机上调用了一个文件.如何将其复制到此容器中.我是否可以在Dockerfile中添加从Host复制到Container的任何步骤.

geo*_*ord 79

像这样使用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
Run Code Online (Sandbox Code Playgroud)

官方文档中阅读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
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,您只能添加Dockerfile文件夹或其子文件夹中的文件.此外,软链接也不起作用.这是由于docker构建过程.构建首先将Dockerfile所在的目录压缩到一个存档,然后使用该存档检索ADD/COPY命令中使用的文件. (4认同)
  • 是否可以使用主机的绝对路径来执行此操作? (2认同)

Ove*_*eaf 16

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

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/失败了,但它是一个有点难看。


小智 5

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

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

我正在使用 docker 版本:17.09.0-ce 并通过以下步骤解决了该问题。

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

第二步:编辑Dockfile并添加命令[location where we want to copy] ADD ./zeppelin-0.7.2-bin-all /usr/local/

第 3 步:转到包含 DockFile 的目录并运行命令 [alternatives also available] docker build

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

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

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

  • 这里重要的一步是该文件必须与 Dockerfile 位于同一文件夹中 (4认同)