前面我们学习了通过 Dockerfile 构建镜像,以及镜像分层和构建原理。本节我们主要学习 Dockerfile 文件的指令。
Dockerfile文件指令
FROM - 基于基准镜像
FROM 命令是定制的镜像都是基于 FROM 的镜像。如:
FROM centos #制作基准镜像,基于centos:latest
FROM scratch #不依赖于任何基准镜像base image
FROM tomcat:jdk8-corretto
# 注:尽量使用官方提供的Base Image,第三方提供的不清楚是否有漏洞或者后门~
LABEL & MAINTAINER - 说明信息
LABEL & MAINTAINER 主要是一些描述信息,这些信息不会产生实质的功能影响,主要用于辨别。
MAINTAINER zwqh.top #可以是组织机构~
LABEL version = "1.0"
LABEL description = "朝雾轻寒博客,一起学编程~"
WORKDIR - 设置工作目录
WORKDIR 主要是设置工作目录,如果设置的文件目录不存在,则会自动创建
WORKDIR /usr/local/tomcat/webapps
WORKDIR /usr/local/projects
# 注:尽量使用绝对路径,易于维护~
ADD & COPY - 复制文件
ADD & COPY 的主要职责就是完成文件复制,这两个命令大多数情况下是一样的,可以用 COPY 代替 ADD。
在不需要解压情况下使用 COPY,ADD 会进行自动解压。
ADD 除了复制,还具备添加远程文件功能,在实际工作中使用较少。
ADD project / #将文件project复制到根路径下
ADD zwqh.tar.gz / #添加到根路径并进行解压
ADD http://www.zwqh.top/1.txt / #将远程文件添加到根目录
ENV - 设置环境变量
ENV 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jar
# 注:尽量使用环境变量,可以提供程序的可维护性~
RUN & ENTRYPOINT & CMD - 执行命令
RUN & ENTRYPOINT & CMD 都是执行命令,只是它们的执行时机不同。
- RUN - 在镜像构建时执行(docker build)
- ENTRYPOINT - 容器启动时执行命令(docker run)
- CMD - 容器启动后执行默认的命令或参数(docker run)
ENTRYPOINT
ENTRYPOINT 有入口点的意思,用于在容器启动时执行命令。
注:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。其不会被docker run 指定的命令覆盖。
CMD
为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
注:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。如果容器启动时指定了附加指令,则CMD被忽略。
命令格式
运行命令有两种格式:
shell 格式:
RUN yum install -y vim
exec 格式:
RUN ["yum","install","-y","vim"]
两种格式区别:
shell运行方式:
- 使用shell执行时,当前shell是父进程,它创建一个子shell进程来执行命令
- 在子shell进程中执行脚本,执行完后,子进程会退出销毁,回到当前shell
exec运行方式:
- 使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变
- 执行完毕,直接退出,并不会退回之前的进程环境
官方推荐采用exec~
示例
示例1:
#Dockerfile如下
FROM centos
RUN ["echo","image building..."]
CMD ["ps","-ef"]
#构建镜像
docker build -t zwqh.top/docker-run:1.0 /usr/image/docker-run
#运行内容
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM centos
---> 300e315adb2f
Step 2/3 : RUN ["echo","image building..."]
---> Running in 121ba33c0337
image building...
Removing intermediate container 121ba33c0337
---> 077c37604e44
Step 3/3 : CMD ["ps","-ef"]
---> Running in 8ebcc13ac3e8
Removing intermediate container 8ebcc13ac3e8
---> c3efc3f1e790
Successfully built c3efc3f1e790
Successfully tagged zwqh.top/docker-run:1.0
#创建运行容器
docker run zwqh.top/docker-run:1.0
#运行内容
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:38 ? 00:00:00 ps -ef
#再次运行
docker run zwqh.top/docker-run:1.0 ls
#运行结果
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#由此我们得知CMD命令会被docker run附加指令覆盖~
可以看到RUN和CMD的运行时期是不同的~
示例2:
#修改Dockerfile如下
FROM centos
RUN ["echo","image building..."]
CMD ["ps","-ef"]
#构建镜像
docker build -t zwqh.top/docker-run:1.1 /usr/image/docker-run
#运行内容
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : RUN ["echo","image building..."]
---> Using cache
---> 077c37604e44
Step 3/4 : ENTRYPOINT ["ps"]
---> Running in 4d756bfe4f43
Removing intermediate container 4d756bfe4f43
---> 599bf6615f40
Step 4/4 : CMD ["-ef"]
---> Running in 3ea20b225b79
Removing intermediate container 3ea20b225b79
---> 850c5a43b39c
Successfully built 850c5a43b39c
Successfully tagged zwqh.top/docker-run:1.1
#我们看到再次构建没有输出“image building”,前面说过,使用了临时镜像快照~
#创建启动容器
docker run zwqh.top/docker-run:1.1
#运行内容
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:44 ? 00:00:00 ps -ef
#我们看到ENTRYPOINT和CMD可以组合使用,CMD可以命令可以由docker run指定附加命令传参~
总结
本节我们学习了Dockerfile常用的基础命令以及运行指令,后面我们通过实战使用一些这些指令,循序渐进..
评论区