ADD 指令和 COPY指令的格式和性质基本一致,但是ADD增加了自动解压缩的功能。
比如<源路径>可以是一个 URL ,Docker 引擎会试图去下载,然后放置到 <目标路径>。下载后的文件权限自动设置为 600 ,如果需要更改权限,需要在增加一层 RUN 进行权限修改。
如果下载的是一个压缩包,一般情况是 RUN 指令,然后使用wget或curl去下载,然后更改权限、解压、清理下载的源文件。
对于压缩包文件,使用 ADD 命令,将会自动解压缩文件到 <目标路径>。压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。
指定一个文件,文件位置
[root@ip-10-1-0-142 addfile]# tree
.
├── Dockerfile
└── moban
└── moban4335.rar1 directory, 2 files
查看Dockerfile 内容
[root@ip-10-1-0-142 addfile]# cat Dockerfile
FROM scratch
ADD moban4335.rar /
构建一个镜像的过程
[root@ip-10-1-0-142 addfile]# docker build -f Dockerfile -t dockeradd:v0.1 moban
Sending build context to Docker daemon 2.593MB
Step 1/2 : FROM scratch
--->
Step 2/2 : ADD moban4335.rar /
---> b8d99119a5c5
Successfully built b8d99119a5c5
Successfully tagged dockeradd:v0.1
<源文件>为 URL
Dockerfile 内容如下,
[root@ip-10-1-0-142 addfile]# cat Dockerfile
FROM nginx
ADD https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.25-linux-glibc2.12-i686.tar.xz /home/mysql
构建镜像
[root@ip-10-1-0-142 addfile]# docker build -f Dockerfile -t dockeradd:v0.1 .
Sending build context to Docker daemon 831.2MB
Step 1/2 : FROM nginx
---> 08b152afcfae
Step 2/2 : ADD https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.25-linux-glibc2.12-i686.tar.xz /home/mysql
Downloading 831.2MB/831.2MB
---> f15a33b49156
Successfully built f15a33b49156
Successfully tagged dockeradd:v0.1
运行一个容器
[root@ip-10-1-0-142 addfile]# docker run -itd --name dockeradd dockeradd:v0.1 bash
b7feda784f2e47a4077e3af089426fa2f1975807bbc0eda607b140e6ff89c741
遵循 Docker 官方的Dockerfile 最佳实践文档中的要求,尽可能使用COPY ,因为 COPY 的语义很明确,就是复制的功能,不包含其他的功能。
最适合使用 ADD 指令的场合,就是需要自动解压缩的场合。
另外,需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会镜像构建变得非常缓慢。
在使用 ADD 指令的时候,还可以加上 --chown=<user>:<group> 选项来改变文件的所属用户和所属组。
ADD --chown=55:mygroup files* /mydir/
ADD --chown=bin files* /mydir/
ADD --chown=1 files* /mydir/
ADD --chown=10:11 files* /mydir/