Dockerfile基础

1, Dockerfile常用保留关键字指令

FROM          //* 表示当前新镜像是基于哪个镜像的,如(centos, ubuntu...)
MAINTAINER    //* 镜像作者的信息
RUN           //* 容器构建时需要运行的命令
EXPOSE        //* 当前容器对外暴露的端口号
WORKDIR       //* 指定在创建容器后,终端默认登录的工作目录,默认为‘/’目录
ENV           //* 设置环境变量
ADD           //* COPY+自动解压缩包
COPY          //* 拷贝文件或目录到镜像中
VOLUME        //* 容器数据卷,用于数据保存和持久化工作
CMD           //* 指定一个容器启动时要运行的命令,可以有多个CMD命令,但是只有最后一个会生效,CMD会被docker run之后的参数替换。
ENTRYPOINT    //* 指定一个容器启动时要运行的命令

2, 通过案例讲解CMD与ENTRYPOINT的区别

创建一个名为CMD的Dockerfile文件

[[email protected] ~]# cat CMD 
FROM centos
CMD ["ls", "/root"]           //* 此处使用CMD

创建一个名为ENT的Dockerfile文件

[[email protected] ~]# cat ENT 
FROM centos
ENTRYPOINT ["ls", "/root"]    //* 此处使用ENTRYPOINT

下面来构建这两个Dockerfile

[[email protected] ~]# docker build -f CMD -t cmd .
Sending build context to Docker daemon 20.99 kB
Step 1/2 : FROM centos
 ---> 0f3e07c0138f
Step 2/2 : CMD ls /root
 ---> Running in 15620da77331
 ---> 9d43f6aa4036
Removing intermediate container 15620da77331
Successfully built 9d43f6aa4036

[[email protected] ~]# docker build -f ENT -t ent .
Sending build context to Docker daemon 20.99 kB
Step 1/2 : FROM centos
 ---> 0f3e07c0138f
Step 2/2 : ENTRYPOINT ls /root
 ---> Running in 9ecff20e2335
 ---> b693f437d5ba
Removing intermediate container 9ecff20e2335
Successfully built b693f437d5ba

执行cmd的镜像
Snipaste_2020-01-04_12-46-35.png
可以看到执行的结果和我们预想的有些不太一样,他把“-l”当成一个独立的命令了!并没有追加到‘ls /root’命令上。
执行ent的镜像
Snipaste_2020-01-04_12-49-50.png
而ENTRYPOING会把命令行追加的参数当成Dockerfile里命令的一部分