上文中我们学习了Dockerfile中ENV命令和ARG命令的基本使用。这里我们继续来学习Dockerfile中文件的操作。
向Docker中添加文件一共有两个命令,一个是copy,一个是add。在日常使用简单添加文件的时候,用这两个命令都是可以的,下面我们来学习一下,这两个命令的一些小区别。
一:copy
这里我们用回第一个Dockerfile实例中的代码:
# 安装Ubuntu系统
FROM ubuntu:latest
# 下载安装python环境
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.9 python3-pip python3.9-dev
# 将文件加入到Ubuntu镜像中
ADD ./test.py /
运行命令创建容器:
docker image build -f /usr/local/docker/Dockerfile.copy -t testcopy:1.1 .
进入容器:
docker container run -it testcopy:1.1
我们发现文件复制成功,使用命令执行test.py
python3 test.py
输出:
hello https://guanchao.site
二:add
上方copy演示的功能add也可以实现,这里就不再重复演示,这里演示点copy没有的功能。
ADD命令可以直接从远程url直接下载文件。
Add另一个特性是自动解压文件的能力。如果 文件是一个可识别压缩格式(tar, gzip, bzip2…)的本地文件(注:无法实现同时下载并解压),就会被解压到指定容器文件系统的路径下。
# 安装Ubuntu系统
FROM ubuntu:latest
RUN mkdir /usr/local/redis
ADD http://download.redis.io/releases/redis-7.0.11.tar.gz /usr/local/redis
这里需要注意一点,从远程url下载文件和自动解压这两件事儿不可以同时发生。
运行上方的Dockerfile:
docker image build -f /usr/local/docker/Dockerfile.add -t testadd:1.0 .
进入镜像testadd:1.0
docker container run -it testadd:1.0
查看目标目录下的文件,如下图所示:
下面我们尝试下解压缩的特性:
# 安装Ubuntu系统
FROM ubuntu:latest
RUN mkdir /usr/local/redis
ADD ./redis-5.0.3.tar.gz /usr/local/redis
运行命令:
docker image build -f /usr/local/docker/Dockerfile.add -t testadd:1.0 .
进入容器,查看是否复制且解压成功,如下图所示:
三:workdir
这个命令功能类似linux中的cd命令。就是切换目录,如果我们Dockerfile中需要再不同目录下进行操作,就可以使用WORKDIR命令来切换目录。
修改一下上方的Dockerfile:
# 安装Ubuntu系统
FROM ubuntu:latest
RUN mkdir /usr/local/redis
WORKDIR /usr/local/redis
ADD ./redis-5.0.3.tar.gz ./
运行命令创建容器:
docker image build -f /usr/local/docker/Dockerfile.add -t testadd:1.0 .
进入容器:
docker container run -it testadd:1.0
结果如下图所示:
四:小结
在 Docker 官方的 Dockerfile 最佳实践文档中要求,尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已,而 ADD则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场景。
另外需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场景使用 ADD指令。
有好的建议,请在下方输入你的评论。