本节我们总结Dockerfile命令是建立在SpringBoot/SpringCloud这样的Java项目基础之上,后续的分析和总结也均围绕SpringBoot/SpringCloud进行。Dockerfile文件作为构建Docker镜像的构建文件,它的地位毋庸置疑,无论我们是否引入了DevOps CI/CD,Dockerfile这个基础文件始终都是不可或缺的一环,所以我们在正式开始介绍CI/CD之前,我们先讲解DevOps CI/CD整个流程中的Dockerfile基础命令,因为整个CI/CD过程中会依赖我们的Dockerfile的这些基础命令!
Dockerfile基础命令
- FROM:指定基础镜像,也就是我们需要扩展的基础镜像,FROM以下的命令均会在这个基础镜像环境中运行,直到下一个FROM指令截止,同一个Dockerfile文件中也可以指定多个FROM指令,每一个FROM指令都是一个构建阶段,多条 FROM 就是多阶段构建,能够将前面构建阶段中的文件资源拷贝到后面的构建阶段中,这个也就是多条FROM命令的最重要的作用,当然多个FROM命令,那最后生成的镜像是哪个阶段的呢?其实是以最后一条 FROM构建阶段为准。
FROM <image>:<tag> AS 别名
- WORKDIR:为接下来要执行的命令指定一个工作目录,也就是FROM命令之后的一些命令,比如执行ENTRYPOINT、ADD、COPY、RUN、CMD命令,当然WORKDIR命令也是支持多次指定,最后一个WORKDIR指定的目录即是容器运行的工作目录。
WORKDIR 路径
- ARG:定义变量,我们在执行docker build --build-arg ARG变量=ARG变量值 这样一条命令创建镜像时,我们就可以这样使用定义的变量值。
docker build --build-arg <ARG>=<值>
- ENV:设置容器运行的环境变量,我们可以通过执行docker run -e ENV环境变量=ENV变量值 对ENV变量进行修改操作。ARG和ENV相关使用区别可以参考How to pass variables from .gitlab.ci.yml to Dockerfile。
docker run -e <ENV>=<值>
- ADD:往FROM指定的基础镜像中添加文件,当前主机上面的文件、文件夹或是Http网络文件。
ADD <src> <dest>
- COPY:只能复制本地文件,从某个FROM编译阶段中拷贝文件到当前镜像中。
COPY <src> <dest> || COPY --from=0/1... <src> <dest> || COPY --from=别名(FROM <image>:<tag> AS 别名) <src> <dest>
- RUN:运行命令,比如mvn clean package、cp src.jar dest.jar,每运行一条RUN命令都会创建一个新的镜像层。所以并非RUN命令越多越好,需要合理使用
RUN <cmd> || RUN ["exec", "paramA", "paramB"]
- MAINTAINER:创建镜像的作者。MAINTAINER 作者 <邮箱>。
MAINTAINER <userName><<email>>
- EXPOSE:设置容器内的进程对外开放的端口,如果想让容器对外的端口和主机的端口要有映射关系,那么启动容器时候需要使用如下命令:
docker run -p [hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort]。EXPOSE <port>
- ENTRYPOINT:容器启动时默认执行的命令,运行容器时添加在镜像之后的参数,对ENTRYPOINT是拼接,这个拼接概念以后我们遇到在仔细讲解。
ENTRYPOINT ["exec","paramA", "paramB"]
- USER:设置容器启动时的用户,ENTRYPOINT、RUN、CMD命令均会使用这个用户运行命令。
USER <user> || USER <user>:<group>
上述Dockerfile基础命令是基于后续我们编写Dockerfile文件所要涉及到的相关命令,Dockerfile的命令还有很多,我们因为目前没有使用到,所以也暂时不做过多讲解,太多了反而影响我们理解!