如何使用Docker的COPY / ADD指令将单个文件复制到图像

时间:2015-07-26 18:47:13

标签: docker dockerfile

我正在尝试将构建上下文的根目录中的单个文件复制到docker镜像中新创建的目录中。

我使用的Dockerfile如下:

layer.cornerRadius

test.txt文件是一个简单的ASCII文本文件,如下所示:

FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test.txt /usr/src/app

然而,当我构建这个图像时,我得到一个图像,说明目标路径不是目录。

$ cat test.txt 
This is a test

我尝试使用docker版本,基本映像和分发版的多种组合,并安装了docker。我也尝试过使用ADD而不是COPY,结果是一样的。

我目前正在使用安装了以下docker版本的CentOS 7上尝试此操作:

$ docker build .
Sending build context to Docker daemon 4.608 kB
Sending build context to Docker daemon 
Step 0 : FROM debian:latest
 ---> 9a61b6b1315e
Step 1 : RUN mkdir -p /usr/src/app
 ---> Using cache
 ---> 86bd44a8776e
Step 2 : WORKDIR /usr/src/app
 ---> Using cache
 ---> ed6771adc681
Step 3 : ADD test.txt /usr/src/app
stat /var/lib/docker/devicemapper/mnt/ee5b9b7029f2adf27d332cbb0d98d6ad9927629a7569fd2d9574cb767b23547b/rootfs/usr/src/app/test.txt: not a directory

我注意到的是我可以复制目录,但不能复制文件。例如,如果我创建一个" test"构建上下文根目录中的目录并将test.txt放入测试目录中,然后我可以成功复制目录:

Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64

请注意,在上面的Dockerfile中,我复制整个./test目录,而不仅仅是./test.txt。这种构建成功。

Docker documentation具有以下COPY指令的示例用例,类似于我想要做的事情:

FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test /usr/src/app

有谁可以指出我做错了什么?如何复制单个文件?

2 个答案:

答案 0 :(得分:25)

As stated in the Dockerfile documentation:

  
      
  • 如果<src>是任何其他类型的文件,则会单独复制该文件及其元数据。在这种情况下,如果<dest>以尾部斜杠/结尾,则会将其视为目录,<src>的内容将写在<dest>/base(<src>)

  •   
  • 如果<dest>未以尾部斜杠结尾,则会将其视为常规文件,<src>的内容将写在<dest>

  •   

因此,您必须使用尾随COPY test.txt /usr/src/app/编写/

答案 1 :(得分:0)

对我来说,我添加的是基于docker-compose.yml而不是Dockerfile的路径:

文件结构

.
..
/docker-compose.yml
/docker/
/docker/php/
/docker/php/Dockerfile
/docker/php/my_file

/中,我正在运行docker-compose up --build

我需要运行COPY docker/php/my_file /some/location而不是COPY my_file /some/location