Docker镜像篇(4) - 玩转Dockerfile指令 - ENV、RUN、CMD、ENTRYPOINT

本文详细介绍了Dockerfile中的ENV指令用于设置镜像环境变量,以及CMD和ENTRYPOINT指令如何定义容器启动时执行的命令。通过示例展示了如何在Dockerfile中设置和使用这些指令,包括环境变量的持久化和命令覆盖的规则。同时,阐述了CMD的三种形式以及ENTRYPOINT与CMD的区别,强调了ENTRYPOINT的不可覆盖性。
摘要由CSDN通过智能技术生成

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",并在之后的指令中进行运用
在这里插入图片描述

构造镜像

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

RUN

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

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

在这里插入图片描述

构建镜像

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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,对容器启动的默认程序进行编写,先来方式一

在这里插入图片描述

构造镜像

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

方式二

在这里插入图片描述

构造镜像

在这里插入图片描述

运行容器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ENTRYPOINT

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

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

Docker镜像篇(3) - 玩转Dockerfile指令 - ADD、WORKDIR、VOLUME、EXPOSE

Docker镜像篇(5) - 镜像导入导出

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值