您现在的位置是:首页 > 教程资讯 > 软件教程

Docker实践(24) – 使用ADD命令添加文件到镜像

2020-03-12 22:25:25【软件教程】人查看

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

虽然在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命令不解压文件。