Docker 的执行顺序是从上而下执行的,所以我们要明确整个流程的执行顺序。除此之外,Docker 在执行每个指令之后都会创建一个新的镜像层并且进行提交。
Docker 会在每一步构建都会将结果提交为镜像,然后将之前的镜像层看作缓存,因此我们重新构建类似的镜像层时会直接复用之前的镜像。如果我们需要跳过,可以使用 --no-cache
选项告诉 Docker 不进行缓存。
指令辨别一:RUN、CMD、ENTRYPOINT
RUN
、 CMD
、 ENTRYPOINT
三个指令的用途非常相识,不同在于,RUN
指令是在容器被构建时运行的命令,而CMD
、 ENTRYPOINT
是启动容器时执行 shell 命令,而 RUN
会被 docker run
命令覆盖,但是 ENTRYPOINT
不会被覆盖。事实上,docker run
命令指定的任何参数都会被当作参数再次传递给 ENTRYPOINT
指令。CMD
、 ENTRYPOINT
两个指令之间也可以一起使用。例如,我们 可以使用 ENTRYPOINT
的 exec 形式设置固定的默认命令和参数,然后使用任一形式的 CMD
来设置可能更改的其他默认值。
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
复制代码
指令辨别二:ADD、COPY
ADD
、 COPY
指令用法一样,唯一不同的是 ADD
支持将归档文件(tar, gzip, bzip2, etc)做提取和解压操作。注意的是,COPY
指令需要复制的目录一定要放在 Dockerfile 文件的同级目录下。
Docker 构建镜像有两种方式,一种方式是使用 docker commit
命令,另外一种方式使用 docker build
命令和 Dockerfile
文件。其中,不推荐使用 docker commit
命令进行构建,因为它没有使得整个流程标准化,因此,在企业的中更加推荐使用 docker build
命令和 Dockerfile
文件来构建我们的镜像。我们使用Dockerfile
文件可以让构建镜像更具备可重复性,同时保证启动脚本和运行程序的标准化。