Linux入门教程:Docker实践(24) – 使用ADD命令添加文件到镜像,Dockerfile


虽然在Dockerfile内能使用RUN命令或者shell命令来添加文件到镜像,不过这可能很快变得难以管理。Dockerfile命令之一的ADD命令设计用来满足将大量文件放入镜像的需求。

问题

你想以一个简单的方法下载和解压一个tarball文件到你的镜像。

解决方法

tar打包和压缩你的文件,并在你的Dockerfile使用ADD指令。

讨论

使用mkdir add_example && cd add_example为Docker构建镜像准备一个新的环境。然后获取tarball文件:

$ curl https://www.flamingspork.com/projects/libeatmydata/libeatmydata-105.tar.gz >  my.tar.gz

创建Dockerfile:

FROM debian RUN mkdir -p /opt/libeatmydata ADD my.tar.gz /opt/libeatmydata/ RUN ls -lRt /opt/libeatmydata

使用docker build –no-cache构建Dockerfile,输出类似如下:

$ docker build --no-cache . Sending build context to Docker daemon 422.9 kB Sending build context to Docker daemon Step 0 : FROM debian  ---> c90d655b99b2 Step 1 : RUN mkdir -p /opt/libeatmydata  ---> Running in fe04bac7df74  ---> c0ab8c88bb46 Removing intermediate container fe04bac7df74 Step 2 : ADD my.tar.gz /opt/libeatmydata/  ---> 06dcd7a88eb7 Removing intermediate container 3f093a1f9e33 Step 3 : RUN ls -lRt /opt/libeatmydata  ---> Running in e3283848ad65 /opt/libeatmydata: total 4 drwxr-xr-x 7 1000 1000 4096 Oct 29 23:02 libeatmydata-105 /opt/libeatmydata/libeatmydata-105: total 880 drwxr-xr-x 2 1000 1000  4096 Oct  29 23:02 config drwxr-xr-x 3 1000 1000  4096 Oct  29 23:02 debian drwxr-xr-x 2 1000 1000  4096 Oct  29 23:02 docs drwxr-xr-x 3 1000 1000  4096 Oct  29 23:02 libeatmydata drwxr-xr-x 2 1000 1000  4096 Oct  29 23:02 m4 -rw-r--r-- 1 1000 1000  4096 Oct  29 23:01 config.h.in [...edited...] -rw-r--r-- 1 1000 1000   1824 Jun 18  2012 pandora_have_better_malloc.m4 -rw-r--r-- 1 1000 1000    742 Jun 18  2012 pandora_header_assert.m4 -rw-r--r-- 1 1000 1000    431 Jun 18  2012 pandora_version.m4  ---> 2ee9b4c8059f Removing intermediate container e3283848ad65 Successfully built 2ee9b4c8059f

你从输出看到tarball文件已经被Docker daemon解压到了目标目录。Docker支持大多数类型的压缩文件,如.gz,.bz2,.xz,.tar。
值得注意的是如果你在Dockerfile直接从url下载tarball文件,那么它们是不会自动解压的,Docker daemon只解压使用ADD命令添加本地的压缩文件。
如果你使用如下的Dockerfile再次构建镜像,你会发现文件只下载没有解压:

FROM debian The file is retrieved from RUN mkdir -p /opt/libeatmydata the internet using a URL. ADD https://www.flamingspork.com/projects/libeatmydata/libeatmydata-105.tar.gz /opt/libeatmydata/ RUN ls -lRt /opt/libeatmydat

下面是输出:

Sending build context to Docker daemon 422.9 kB Sending build context to Docker daemon Step 0 : FROM debian  ---> c90d655b99b2 Step 1 : RUN mkdir -p /opt/libeatmydata  ---> Running in 6ac454c52962 ---> bdd948e413c1 Removing intermediate container 6ac454c52962 Step 2 : ADD  https://www.flamingspork.com/projects/libeatmydata/libeatmydata-105.tar.gz  /opt/libeatmydata/ Downloading [==================================================>] 419.4 kB/419.4 kB  ---> 9d8758e90b64 Removing intermediate container 02545663f13f Step 3 : RUN ls -lRt /opt/libeatmydata  ---> Running in a947eaa04b8e /opt/libeatmydata: total 412 -rw------- 1 root root 419427 Jan  1  1970 libeatmydata-105.tar.gz  ---> f18886c2418a Removing intermediate container a947eaa04b8e Successfully built f18886c2418a

如果你想添加一个压缩文件到镜像而不想解压,你可以使用COPY命令,这个命令与ADD命令类似,区别就是COPY命令不解压文件。

相关内容