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