如何使用 Docker 的 COPY/ADD 说明将单个文件复制到图像
How to use Docker's COPY/ADD instructions to copy a single file to an image
我正在尝试将单个文件从构建上下文的根目录复制到 docker 映像中新创建的目录中。
我使用的Dockerfile如下:
FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test.txt /usr/src/app
test.txt文件是一个简单的ASCII文本文件如下:
$ cat test.txt
This is a test
但是,当我构建此映像时,我得到一个说明目标路径不是目录的映像。
$ 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
我尝试使用 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
我注意到我可以复制目录,但不能复制文件。例如,如果我在构建上下文根目录中创建一个 "test" 目录并将 test.txt 放入测试目录中,那么我可以成功复制该目录:
FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test /usr/src/app
请注意,在上面的 Dockerfile 中,我复制了整个 ./test 目录,而不仅仅是 ./test.txt。构建成功。
Docker documentation 具有以下 COPY 指令示例用例,这与我正在尝试做的类似:
COPY hom?.txt /mydir/
谁能指出我做错了什么?我怎样才能复制单个文件?
As stated in the Dockerfile documentation:
If <src>
is any other kind of file, it is copied individually along with its metadata. In this case, if <dest>
ends with a trailing slash /
, it will be considered a directory and the contents of <src>
will be written at <dest>/base(<src>)
.
If <dest>
does not end with a trailing slash, it will be considered a regular file and the contents of <src>
will be written at <dest>
.
因此,您必须在 COPY test.txt /usr/src/app/
的结尾加上 /
。
对我来说,我添加的路径基于 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
我正在尝试将单个文件从构建上下文的根目录复制到 docker 映像中新创建的目录中。
我使用的Dockerfile如下:
FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test.txt /usr/src/app
test.txt文件是一个简单的ASCII文本文件如下:
$ cat test.txt
This is a test
但是,当我构建此映像时,我得到一个说明目标路径不是目录的映像。
$ 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
我尝试使用 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
我注意到我可以复制目录,但不能复制文件。例如,如果我在构建上下文根目录中创建一个 "test" 目录并将 test.txt 放入测试目录中,那么我可以成功复制该目录:
FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test /usr/src/app
请注意,在上面的 Dockerfile 中,我复制了整个 ./test 目录,而不仅仅是 ./test.txt。构建成功。
Docker documentation 具有以下 COPY 指令示例用例,这与我正在尝试做的类似:
COPY hom?.txt /mydir/
谁能指出我做错了什么?我怎样才能复制单个文件?
As stated in the Dockerfile documentation:
If
<src>
is any other kind of file, it is copied individually along with its metadata. In this case, if<dest>
ends with a trailing slash/
, it will be considered a directory and the contents of<src>
will be written at<dest>/base(<src>)
.If
<dest>
does not end with a trailing slash, it will be considered a regular file and the contents of<src>
will be written at<dest>
.
因此,您必须在 COPY test.txt /usr/src/app/
的结尾加上 /
。
对我来说,我添加的路径基于 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