ENV

用于为镜像定义所需的环境变量,并可被kockerfile文件位于其后的其他指令所调用
比如
定义单个环境变量 ENV DOC_ROOT /data/
定义多个环境变量,使用“ \ ”隔开表示换行 ENV DOC_ROOT=/data/
WEB_SERVER_PACKAGE=“nginx-1.19.2”

编写Dockerfile文件,设置环境变量DOC_ROOT为/data/web/html/和WEB_SERVER_PACKAGE为"nginx-1.19.2",并在之后的指令中进行运用

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker build指定变量

构造镜像

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_环境变量_02

运行容器,可以看出环境变量配置成功

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker_03

查看当前容器的环境变量,可以发现,我们在构造镜像时,定义的环境变量存在

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_Dockerfile_04

接下来我们在“ docker run ”时,去修改环境变量,可以发现环境变量修改成功

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker_05

我们已经将版本修改为1.19.1,那么下载的也一定是1.19.1版本吗?我们可以发现nginx版本没有改变,因为docker build
在docker run前完成的

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_Dockerfile_06

RUN

run指令是在构建镜像时运行的命令,创建Docker镜像的步骤,也就是docker bulid中执行的,其实就是顺着Dockerfile文件的指令顺序运行

编写Dockerfile,新建a.txt文本,编写内容到a.txt文本中,修改名字

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker_07

构建镜像

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker build指定变量_08

查看是否存在刚刚创建的目录,及其内容

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_环境变量_09


dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker_10

CMD

1. 之前默认打开容器的程序为" /bin/sh ",现在我们希望修改程序打开的程序,我们也可以发现redis的CMD为“ redis-server ”,nginx的CMD为“ nginx -g daemon off”,所以这些的父进程都不在是“ /bin/sh” ,也就是说pid=1 不再是“ /bin/sh”

2. CMD命令是当Docker镜像被启动后Docker容器将会默认执行的命令。一个Dockerfile中只能有一个CMD命令。通过执行docker run 启动镜像可以重载CMD命令。

3. CMD有三种形式
CMD command param1 param2    在/bin/sh中执行,提供需要交互的应用/bin/sh不为父进程
CMD ["executable","param1","param2"]  使用exec执行,推荐方式,/bin/sh为父进程
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;

4. 如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

5. 指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。

接下来我们创建一个新的文件夹img2,编写Dockerfile,对容器启动的默认程序进行编写,先来方式一

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_环境变量_11

构造镜像

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker build指定变量_12

运行镜像,卡住,因为默认不是/bin/sh,而是httpd,

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker_13

通过查看镜像“ixlove:v0.2-1”的信息可以发现,CMD默认为httpd,通过"/bin/sh -c"来运行“/bin/httpd -f -h”

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker build指定变量_14


dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_环境变量_15


dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_环境变量_16

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_Dockerfile_17

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_环境变量_18

我们也可以通打开容器的方式,可以发现/bin/sh不再是父进程,而/bin/httpd是父进程

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_环境变量_19

为了进一步证明CMD的命令会被用户启动容器时指定的命令覆盖,我们输入以下命令,即可得出该结论

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker_20

方式二

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker_21

构造镜像

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_Dockerfile_22

运行容器

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker build指定变量_23


dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_Dockerfile_24


dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker_25


dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_Dockerfile_26


dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker_27

ENTRYPOINT

1. ENTRYPOINT 允许你把你的容器启动时候去执行某件事情,让你的容器变成可执行的

2. CMD与ENTRYPOINT的区别
  CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
  ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker build指定变量_28

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_环境变量_29

运行容器卡住,通过docker ps可以找到

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_docker_30

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_Dockerfile_31

关闭容器,执行ls命令,发现没有用,因为被忽略了

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_环境变量_32

如果希望在启动的时候执行“ls”命令,可以使用entrypoint参数

dockerfile中war包指定使用项目外部的配置文件 docker run指定环境变量_Dockerfile_33