首页 > 其他分享 >Dockerfile 指令详解

Dockerfile 指令详解

时间:2022-11-14 22:02:51浏览次数:68  
标签:bin shell CMD 详解 ENTRYPOINT 指令 docker Dockerfile

Dockerfile 指令详解

  本贴最后更新于 306 天前,其中的信息可能已经水流花落
前言:近年来Docker非常火,想要玩好Docker的话Dockerfile是绕不开的,这就好比想要玩好linux服务器绕不开shell道理是一样的。今天我们就来聊一聊Dockerfile怎么写,那些指令到底是什么意思。
一、先来看一个简单的Dockerfile
 
#这个Dockerfile作用是打一个python3项目环境 FROM python:3-alpine WORKDIR /app ADD . /app RUN pip3 install -r requirements.txt -i https://pypi.douban.com/simple CMD ["python3", "main.py"]   #这个Dockerfile作用Dockerfile部署django项目 FROM centos:7 MAINTAINER haili ADD requeriments.txt /home WORKDIR /home RUN yum update && yum -y install mysql && yum -y install python3-pip && pip3 install -r requirements.txt ADD autoTest /home/ WORKDIR /home/autoTest EXPOSE 8000 ENTRYPOINT uwsgi --ini uwsgi.ini 
二、Dockerfile编写规则
  1. 指令大小写不敏感,为了区分习惯上用大写
  2. Dockerfile非注释行第一行必须是FROM
  3. 文件名必须是Dockerfile
  4. Dockerfile指定一个专门的目录为工作空间
  5. 所有引入映射的文件必须在这个工作空间目录下
  6. Dockerfile工作空间目录下支持隐藏文件(.dockeringore)
  7. (.dockeringore)作用是用于存放不需要打包导入镜像的文件,根目录就是工作空间目录
  8. 每一条指令都会生成一个镜像层,镜像层多了执行效率就慢,能写成一条指定的就写成一条
三、Dockerfile指令详解
  1. FROM:基础镜像
 1.1、FROM是Dockerfile文件开篇第一个非注释行代码
 1.2、用于为镜像文件构建过程指定基础镜像,后续的指令都基于该基础镜像环境运行
 1.3、基础镜像可以是任何一个镜像文件
 1.4、docker build 会在docker宿主机上查找指定的文件,如未找到会自动去Docker Hub Registry上拉取
 1.5、如果没找到对应的镜像就会返回错误信息
  1. MAINTAINER:镜像作者信息
    2.1、废弃了,使用LABLE替代
    
  2. LABLE:镜像描述信息
    3.1、LABLE author="haili"
    
  3. COPY:从Docker宿主机复制文件至创建的新镜像文件
    4.1、COPY <src> <dest>
    4.2、COPY ["<src>",.... "<dest>"]
    4.3、<src>:要复制的源文件或目录,支持使用通配符
         1、<src>必须是build上下文中的路径,不能是其父目录路径
         2、如果<src>是目录,则其内部文件和子目录都会被递归复制,但是<src>目录本身不会被复制
         3、如果指定了多个<src>,或者<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾
    4.4、<dest>:目标路径,即正在创建的images的文件系统路径
         1、建议使用绝对路径,否则COPY指定以WORKDIR为其实路径
         2、如果<dest>不存在,将会被自动创建,包括其父目录路径一起创建
    4.5、复制文件
         COPY testFile /mnt
    4.6、复制目录
         COPY testDir /mnt/testDir
         1、testDir下所有文件和目录都会被递归复制
         2、目标路径要写testDir,否则会复制到/mnt下
    
  4. ADD:类似于COPY指令,ADD支持tar文件和URL路径
    5.1、ADD <src> <dest>
    5.2、ADD ["<src>",.... "<dest>"]
    5.3、如果<src>为URL切<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<fimename>,如果<dest>以/结尾,则文件名URL指定的文件将被下载并保存为<dest>/fimename
    5.4、如果<src>是一个压缩文件(tar),会被解压为一个目录,但是通过URL下载的tar文件不会被解压
    5.5、如果是多个<src>,或者是同一个<src>使用了通配符,则<dest>必须是以/结尾的目录,如果<dest>不以/结尾,则<src>会被作为一个普通文件,<src>内容讲被写入到<dest>
    
  5. WORKDIR:用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY、ADD指定设定工作目录
    6.1、WORKDIR /mnt,如果目录不存在会自动创建,包括他的父目录
    6.2、一个Dockerfile中WORKDIR可以出现多次,其路径也可以为相对路径,相对路径是基于前一个WORKDIR路径
    6.3、WORKDIR也可以调用ENV指定的变量
    6.4:举例
         from python:latest
         workdir /mnt
         run touch a.txt
         workdir /usr
         run touch b.txt
    
  6. VOLUME:数据卷,用于在image中创建挂载点目录,以挂载Docker host上的卷或者其他容器上的卷
    7.1、VOLUM mount_point
    7.2、VOLUM ["mount_point1","mount_point2"]
    7.3、如果挂载点目录下有文件存在,docker run命令会在卷挂载完成后将所有文件复制到容器中
    
  7. EXPOSE:为容器打开指定的监听端口以实现与外部通信
    8.1、EXPOSE <port> </portocol>
         1、<port>:端口号
         2、</portocol>:协议类型,默认为TCP协议
         EXPOSE 8080/tcp 8081/udp
    8.2、不会直接对外暴露这里的端口,只有在run的时候加上-P(大写)才会将EXPOSE的端口暴露出去
    
  8. ENV:用于为镜像定义所需的环境变量,可以被Dockerfile文件中其他命令调用(ENV、ADD、COPY、RUN、CMD)
    9.1、ENV key value
         1、key之后的所有内容都会被视为value,因此,一次只能设置一个变量 
    9.2、ENV key=value
         1、可以设置多个变量,每个key=value键值对为一个变量
         2、如果value中包含空格需要用反斜杠转义,也可以对value加引号进行标识,反斜杠也可以用于续行
    9.3、调用格式:$variable_name 或 ${variable_name}
    9.4、定义多个变量建议使用第二种方式,以便在同一层中完成
    9.5、举例
         ENV DOC_DIR=/mnt/doc
         COPY index.html ${DOC_DIR:-/mnt/doc} 
         #-:如果DOC_DIR不存在则使用-后面的默认值
         #+:如果DOC_DIR存在则使用+后面的值
    
  9. RUN:docker build镜像构建的时候需要执行的shell命令默认"/bin/sh -c"运行
    10.1、docker build过程中需要执行的命令
    10.2、RUN是在镜像构建完成之后运行结束
    10.3、RUN执行的命令只能基于基础镜像的命令,执行之前先要确定基础镜像是否有该命令
    10.4、一个Dockerfile可以写多个RUN
        语法一、RUN command1 && command2....  
              1、通常是shell命令且以"/bin/sh -c"来运行它,此时运行为shell的子进程
              2、进程在容器中的PID!=1,不能接收unix信号,当使用docker stop 将无法接收到
              3、RUN echo "test_demo" > a.txt 此时可以使用shell特性
        语法二、RUN ["executable","param1","param2"]
              1、executable为要运行的命令
              2、param1为命令运行的参数
              3、不会以"/bin/sh -c"运行(非shell子进程),因此不支持shell操作符如变量替换和通配符(?,*等)
              4、如果运行命令需要依赖shell特性可以增加参数,手动启动为shell的子进程
                 RUN ["/bin/bash","-c","executable","param1"]
              5、list中的参数要使用双引号
    
  10. CMD:启动容器指定默认要运行的程序或命令,默认"/bin/sh -c"运行
    11.1、docker run过程中需要执行的命令
    11.2、CMD运行结束后容器就将终止
    11.3、CMD指定的命令将可以被 docker run 最后面的命令覆盖
    11.4、一个Dockerfile写多个CMD只有最后一个CMD会生效
        语法一、CMD command
               1、通常是shell命令且以"/bin/sh -c"来运行它,此时运行为shell的子进程,能使用shell操作符
               2、进程在容器中的PID!=1,不能接收unix信号,当使用docker stop 将无法接收到
               3、CMD /bin/httpd -f -h ${httpd}
                  此时在运行容器的时候加-it参数无法进入交互式模式,需要使用docker exec进入交互模式
        语法二、CMD ["executable","param1","param2"]
               1、不会以"/bin/sh -c"运行(非shell子进程),因此不支持shell操作符如变量替换和通配符(?,*等)
               2、如果运行命令需要依赖shell特性可以增加参数,手动启动为shell的子进程
                  CMD ["/bin/bash","-c","executable","param1","param2"](有问题,不能启动容器)
        语法三、CMD ["param1","param2"]
               1、需要结合ENTRYPOINT指令提供默认参数使用
    
  11. ENTRYPOINT:类型CMD指令的功能,用于为容器指定默认运行程序或命令
    1、与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数覆盖,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序
    2、docker run命令的 --entrypoint选项参数可以覆盖ENTRYPOINT指令指定的程序
    3、一个Dockerfile中可以有多个ENTRYPOINT,但是只有最后一个会生效
    4、ENTRYPOINT主要用于shell作为启动其他进程的父进程,后面跟的参数被当成子进程来启动
        语法一:ENTRYPOINT command
        语法二:ENTRYPOINT  ["/bin/bash","param1","param2"]
    
  12. CMD和ENTRYPOINT同时存在Dockerfile中
    1、CMD的值会当做参数传递给ENTRYPOINT
    2、实现使用shell子进程启动httpd
    3、如果docker run再传入参数,是传给ENTRYPOINT的,因为ENTRYPOINT有自己的参数,此时CMD参数会被ducker run后面跟的参数覆盖,并不是覆盖ENTRYPOINT的参数,要覆盖ENTRYPOINT的参数需要使用--entrypoint选项
        CMD ["/bin/httpd/","-f"]
        ENTRYPOINT /bin/bash -c -h
        通过传参启动容器
        FROM python:latest
        LABLE auth="haili"
        ENV NGX_DOC_ROOT='/data/web/html'
        ADD entrypoint.sh /bin/
        CMD ['/usr/sbin/nginx','-g','daemon off;']
        ENTRYPOINT ['/bin/sh','-c','/bin/entrypoint.sh']
        1、先执行ENTRYPOINT,然后讲CMD的值当做参数传给ENTRYPOINT进行执行
    
  13. USER:指定运行image时和Dockerfile中任何RUN、CMD、ENTRYPOINT指令指定的程序的用户
    1、使用用户名或者UID
    2、默认情况下container的运行身份为root用户
    3、USER UID | user_name
    4、UID 和 user_name必须存在/etc/passwd当中,否则会报错
    
  14. HEALTHCHECK:健康检查,定义一个命令用于检查主进程工作状态是否健康
    15.1、HEALTHCHECK参数
        1、--interval=DURATION(default 30s) 健康检查间隔时间
        2、--timeout=DURATION(default 30s) 超时时间
        3、--start-period=DURATION(default 0s) 容器启动多久后执行健康检查
        4、--retries=N(default 30s) 检测次数
    15.2、检查结果
        0:成功
        1:失败
        2:预留字段
    
    15.3、举例
         HEALTHCHECK --interval=5m --timeout=5s CMD curl -f http://localhost:8080 ||exit1
    
  15. SHELL:指定运行RUN、CMD、ENTRYPOINT的shell程序
  16. STOPSIGNAL:给主进程发送信号
  17. ARG:docker build过程中的参数
     18.1、定义pyton镜像作者,通过参数传入
        FROM python
        ARG author="latest"
        LABLE author="${author}"
        18.2、使用
        docker build --build-arg author="haili"
        18.3、常用在docker build 过程中替换参数
    
  18. ONBUILD:用于在Dockerfile中定义一个触发器
    19.1、Dockerfile1中加一个ONBUILD add file,当docker build -t=testpython Dockerfile1的时候ONBUILD指令不会被执行,Dockerfile2中FROM testpython(Dockerfile1构建后生成的镜像),当运行docker build -t=test Dockerfile2的时候Dockerfile1中的ONBUILD add file会被执行
    19.2、Dockerfile用于build镜像文件,此镜像文件可以作为base image被另外一个Dockerfile作为FROM参数使用,并以之构建新的镜像文件
    19.3、在后面这个Dockerfile中的FROM指令在build过程中被执行时,将触发创建其base image的Dockerfile中ONBUILD指定定义的触发器
    19.4、尽管任何指令都可以注册为触发器指令,但是ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令
    19.5、使用包含ONBUILD指令的Dockerfile构建镜像应该使用特殊标签如,python:1.0-onbuild
    19.6、ONBUILD指令中使用ADD COPY指令要格外小心,因为新构建过程山下文缺少指定的源文件就会失败
    
  软件测试工程师的心灵社区  Give testers a home. 湘ICP备17007107号-3 • Powered by 柠檬班 友情链接     测试窝

标签:bin,shell,CMD,详解,ENTRYPOINT,指令,docker,Dockerfile
From: https://www.cnblogs.com/Small-Cheng/p/16890592.html

相关文章

  • 嵌入式-Linux常用初级指令和介绍
    ls:列出当前文件夹下有哪些文件 ls-a:显示所有文件,包括隐藏的文件和文件夹pwd:显示在当前哪个文件夹下面  mkdir+新建文件夹名称:新建文件夹  进入文件夹:cd+......
  • 实例方法、类方法、静态方法、私有方法详解
     实例方法、类方法、静态方法、私有方法详解 一、实例方法实例方法的定义 classTestDemo:#实例方法定义在类中deftest_01(self):print("test_01是实......
  • Day11.3:利用for循环打印三角形——思维详解
    利用for循环打印三角形要求:利用for循环打印出以下三角形思路与分析:观察三角形,每一行的左边其实都有打印内容的,只是被空格替换了;将左边空格的部分替换成*,补齐后会得......
  • git常用指令速查
    重要指令:工作流程图上的7个指令(clone+fetch+pull+checkout+add+commit+push)和2个常用指令(log+merge)常用指令速查:   --基本操作类:        gitinit......
  • cfssl命令详解
    CFSSL是CloudFlare开源的一款PKI/TLS工具。CFSSL包含一个命令行工具和一个用于签名,验证并且捆绑TLS证书的HTTPAPI服务。使用Go语言编写。CFSSL包括:一组用于生成......
  • 支持多脚本语言的UDF等六大特性,TDengine 3.0计算引擎详解
    小 T 导读:在8月13日的TDengine开发者大会上,TDengine计算引擎架构师廖浩均带来题为《TDengine3.0——全新计算查询引擎的设计》的主题演讲,详细阐述了TDengine3.0......
  • TDengine 3.0 如何助力工业互联网实现边云协同?taosX 功能详解
    小 T 导读:在8月13日的TDengine开发者大会上,TDengine联合创始人侯江燚带来题为《核心代码全部开源,企业版价值何在》的主题演讲,为大家讲解了TDengine3.0企业版对......
  • 支持 10 亿个设备、100 台服务器节点,TDengine 3.0 架构详解
    在8月13日的TDengine开发者大会上,TDengine分布式系统架构师关胜亮带来题为《支持10亿时间线、100个节点的TDengine分布式系统架构设计》的主题演讲,详细阐述了T......
  • git rebase 详解
    https://blog.csdn.net/weixin_42310154/article/details/119004977图解Git基本命令merge和rebase0引言网上有太多讲rebase和merge的文章,但大多都是复制粘贴没......
  • Pod详解之Pod生命周期
    Pod生命周期我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程:-pod创建过程-运行初始化容器(initcontainer)过程-运行主容器(mainc......