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

And*_*ler 22 docker dockerfile

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

我使用的Dockerfile如下:

FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test.txt /usr/src/app
Run Code Online (Sandbox Code Playgroud)

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

$ cat test.txt 
This is a test
Run Code Online (Sandbox Code Playgroud)

但是,当我构建此图像时,我得到一个图像,指出目标路径不是目录.

$ 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
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test /usr/src/app
Run Code Online (Sandbox Code Playgroud)

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

泊坞窗文档具有复制指令,类似于什么,我试图做下面的示例使用情况:

COPY hom?.txt /mydir/
Run Code Online (Sandbox Code Playgroud)

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

jwo*_*der 29

如Dockerfile文档中所述:

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

  • 如果<dest>不以尾部斜杠结束,则将其视为常规文件,<src>并将写入内容<dest>.

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