注:本文基于CentOS 6.5 3.10内核,docker版本1.7.1

背景

制作docker镜像时,要把一个文件拷贝至镜像中,可以使用ADD或者COPY命令,但是使用的时候一直报错。

[root@localhost test]# docker build .
Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM gpmidi/centos-6.5
 ---> d7943348aefb
Step 1 : ADD a /root
stat /var/lib/docker/devicemapper/mnt/45f35175c0848980b14929ead6ba6bc3b85b4836c5f0861cd25c9fad7c27e4eb/rootfs/root/a: not a directory

最简单的操作,把当前目录的a文件拷贝至镜像环境中的/root目录,然而就是不成功。

换成COPY也一样报错。

[root@localhost test]# docker build .
Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM gpmidi/centos-6.5
 ---> d7943348aefb
Step 1 : COPY a /root
stat /var/lib/docker/devicemapper/mnt/31d0d0527b091d952147cfb63b8700ef6865b88ae768862e4aa16518f5541101/rootfs/root/a: not a directory

解决方案

在网上找了很久,一度还以为是bug,然而并不是,而是没搞清楚ADD/COPY的用法。在拷贝文件的时候docker是用“/”来区分目录和文件的,也就是“/root”是被当做根目录文件root,“/root/”才被识别为目录。知道这个点后,修改就简单了,在目录最后以斜杆“/”结尾即可。

[root@localhost test]# docker build .
Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM gpmidi/centos-6.5
 ---> d7943348aefb
Step 1 : COPY a /root/
 ---> f6477c17485c
Removing intermediate container 0d5ca33a3bda
Successfully built f6477c17485c

注意事项

在查阅资料时还看到一些其他注意事项,一并记录。
1、拷贝或者添加文件时不能超出当前目录范围,即不能使用以下方式:

ADD ../data/file  /home/
COPY /home/a.zip /home/

因为在docker build最开始就将当前上下文环境传给 docker deamon,因此如果使用其他目录,docker deamon无法找到这些文件,这也就是我们使用docker build . ,这个“.”的用意。

2、COPY命令拷贝是原样拷贝,而ADD命令会将压缩包解压。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐