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

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

问题

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

解决方法

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

讨论

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

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

创建Dockerfile:

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

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

  1. $ docker build --no-cache .
  2. Sending build context to Docker daemon 422.9 kB
  3. Sending build context to Docker daemon
  4. Step 0 : FROM debian
  5.  ---> c90d655b99b2
  6. Step 1 : RUN mkdir -p /opt/libeatmydata
  7.  ---> Running in fe04bac7df74
  8.  ---> c0ab8c88bb46
  9. Removing intermediate container fe04bac7df74
  10. Step 2 : ADD my.tar.gz /opt/libeatmydata/
  11.  ---> 06dcd7a88eb7
  12. Removing intermediate container 3f093a1f9e33
  13. Step 3 : RUN ls -lRt /opt/libeatmydata
  14.  ---> Running in e3283848ad65
  15. /opt/libeatmydata:
  16. total 4
  17. drwxr-xr-x 7 1000 1000 4096 Oct 29 23:02 libeatmydata-105
  18. /opt/libeatmydata/libeatmydata-105:
  19. total 880
  20. drwxr-xr-x 2 1000 1000  4096 Oct  29 23:02 config
  21. drwxr-xr-x 3 1000 1000  4096 Oct  29 23:02 debian
  22. drwxr-xr-x 2 1000 1000  4096 Oct  29 23:02 docs
  23. drwxr-xr-x 3 1000 1000  4096 Oct  29 23:02 libeatmydata
  24. drwxr-xr-x 2 1000 1000  4096 Oct  29 23:02 m4
  25. -rw-r--r-- 1 1000 1000  4096 Oct  29 23:01 config.h.in
  26. [...edited...]
  27. -rw-r--r-- 1 1000 1000   1824 Jun 18  2012 pandora_have_better_malloc.m4
  28. -rw-r--r-- 1 1000 1000    742 Jun 18  2012 pandora_header_assert.m4
  29. -rw-r--r-- 1 1000 1000    431 Jun 18  2012 pandora_version.m4
  30.  ---> 2ee9b4c8059f
  31. Removing intermediate container e3283848ad65
  32. Successfully built 2ee9b4c8059f

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

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

下面是输出:

  1. Sending build context to Docker daemon 422.9 kB
  2. Sending build context to Docker daemon
  3. Step 0 : FROM debian
  4.  ---> c90d655b99b2
  5. Step 1 : RUN mkdir -p /opt/libeatmydata
  6.  ---> Running in 6ac454c52962
  7. ---> bdd948e413c1
  8. Removing intermediate container 6ac454c52962
  9. Step 2 : ADD  https://www.flamingspork.com/projects/libeatmydata/libeatmydata-105.tar.gz  /opt/libeatmydata/
  10. Downloading [==================================================>]
  11. 419.4 kB/419.4 kB
  12.  ---> 9d8758e90b64
  13. Removing intermediate container 02545663f13f
  14. Step 3 : RUN ls -lRt /opt/libeatmydata
  15.  ---> Running in a947eaa04b8e
  16. /opt/libeatmydata:
  17. total 412
  18. -rw------- 1 root root 419427 Jan  1  1970
  19. libeatmydata-105.tar.gz
  20.  ---> f18886c2418a
  21. Removing intermediate container a947eaa04b8e
  22. Successfully built f18886c2418a

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

标签:Docker 发布于:2019-11-20 13:05:04