• 售前

  • 售后

热门帖子
入门百科

Dockerfile中常用命令汇总

[复制链接]
粘瓜莱 显示全部楼层 发表于 2021-10-25 20:11:59 |阅读模式 打印 上一主题 下一主题
语法构成:

1 解释信息
2 指令---参数 [通常要大写|实质上不区分巨细写]
3 次序实行
4 第一个非解释行必须是from [基于谁人基础镜像制作]   
5 必要一个专用目次[自己创建]
6 首字目必须大写---Dockerfile
7 制作镜像依靠到文件大概包组时,必须提前准备至专用目次下
.dockerignore file --每一行中界说一个忽略文件
    --创建在工作目次中
    例如:pam.d/su*

.........................................................

dockerfile中的常用指令:

1 FROM ---指定基础镜像

    基础镜像不存在会在Docker Hub上拉去
利用格式:   
FROM <镜像>:[tag]     
FROM <镜像>@digest[校验码]
当前主机没有此镜像时,会自动去官网HUB下载
..............................................

2 MAINTANIER --提供Dockerfile 制作者提供本人信息

    [逐渐废弃]
LABLE --替换MAINTANIER
具体利用:
LABLE maintainer="作者信息"
利用格式:
  1. MAINTANIER "guowei <597599150@qq.com>"
复制代码
.......................................................

3 COPY --把宿主机中的文件复制到镜像中去!

    文件要在Dockerfile工作目次
src 原文件
    --支持通配符
    --通常相对路径
dest 目标路径   
    --通常绝对路径
有空缺字符隔开的字串必要用"",否则会被当做两个文件!
文件复制准则:
1 src必须是build上下文中的路径,不能是其父目次
2 假如src是目次,则其内部文件或子目次会被递归复制
   但src目次自身不会被复制
3 假如指定了多个src,或在src中利用了通配符,则dest必须是一个
  目次,且必须以/结尾
4 假如dest实现不存在,它将会被自动创建,这包罗其父目次
..............................................................

4 ADD --类似COPY命令
支持URL路径----假如可以访问网络的话,会访问网络下载
到本地然后打包进镜像!
操纵准则:
1 假如src为URL且dest不以/结尾,则src指定的文件将被下载并
直接被创建为dest;假如dest以/结尾,则文件名URL指定的文件
将被直接下载并生存为dest/filename
2 假如是压缩包会被解压,但通过URL路径获取到的tar文件不会被睁开
3 假如src有多个,或其间接或直接利用了通配符,则dest必须是一个
以/结尾的目次路径,假如dest不以/结尾,则其被视为一个普通文件
src的内容将被直接写入到dest中!
...............................................................

5 WORKDIR --指定工作目次
每次只会影响这个指令后续的指令
  1. ADD nginx-1.14.2.tar.gz /usr/local/src/ --不受影响
复制代码
WORKDIR /usr/local/src/
ADD nginx-1.14.2.tar.gz ./ --受影响
.............................................................

6 VOLUME --卷

只能界说docker管理的卷:
VOLUME /data/mysql
运行的时候会随机在宿主机的目次下生成一个卷目次!
................................................................

7 EXPOSE 为容器打开指定要监听的端口以实现与外部通讯
利用格式:
EXPOSE 80/tcp 23/udp
不加协议默以为tcp
利用-P选项可以袒露这里指定的端口!
但是宿主的关联至这个端口的端口是随机的!
..............................................................

8 ENV

用于为镜像界说所需的环境变量,并可被Dockerfile文件中位于
其后的别的命令所调用
调用格式:
$A 或 ${A}
ENV <key> <value>
ENV <key>=<value>
第一种格式中,key之后的全部内容均会被其视作<value>的构成部门
因此,一次只能设置一个变量!
第二种格式可用一次设置多个变量,每个变量为一个<key>=<value>
的键值对,假如<value>中包罗空格,可以反斜线(\)举行转义
也可以通过对<value>加引号举行标识。另外,反斜线也可用于续航
界说多个变量时。发起利用第二种方式,以便在同一层中完玉成部功能
具体用法:
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin/
ENV A /web/html
COPY index.html ${A:-/web/html}
在docker run 中通报变量:
docker run -e
    传变量值
    假如在dockerfile中赋值变量后也能在docker run中继续赋值
    docker run --name b1 --rm -e A=xx [镜像ID]
    不会影响docker build 的过程!
    printenv --输出环境变量信息
    ..............................................................

    9 RUN命令:

    利用格式:
    RUN <command>
    RUN ["<executable>","<param1>","<param2>"]
    第一种格式中 <command命令通常是一个shell命令 且以"/bin/sh -c">来运行它
    这意味此进程在容器中的PID不能为1,不能吸收Unix信号,因此,当利用docker stop命令
    来制止容器时,此进程吸收不到信号
    第二种语法格式中的参数是一个JSON格式的数组,此中<executable>为要运行的命令,后面的
    <paramN>为通报给命令的选项或参数,然而,此种格式指定的命令不会以"/bin/sh -c">来运行它
    因此常见的shell操纵如变量替换以及通配符替换将不会举行 不外假如要运行的命令依靠于
    此shell特性的话,可以将其替换为下面的格式:
    RUN ["/bin/bash","-c","<executable>","<param1>"]
    ........................................................................

    10 CMD命令:运行于docker run中

    语法有三种写法
    1. CMD ["executable","param1","param2"] --启动为ID为1的进程
    具体实例:
    1. CMD ["/bin/sh","-c","/bin/httpd","-f","-h /web/html]
    复制代码
    2. CMD ["param1","param2"]
    3. CMD command param1 param2 --直接运营为shell的子进程
    param*=实行参数
    例如第二种:
    CMD ["nginx"]
    1. docker run -it -p 8888:80 172.20.23.31/server1/nginx-base:v1 nginx
    复制代码
    只能是双引号!
    CMD ["param1","param2"]
    --此种用法用于为ENTRYPOINT指令提供默认参数
    可用于实行脚本:
    添加脚本:
    ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
    RUN chmod +x /apps/tomcat/bin/run_tomcat.sh
    RUN chown -R tomcat:tomcat /apps /data/tomcat
    CMD ["/apps/tomcat/bin/run_tomcat.sh"] -- 引用脚本!
    ..............................................................

    11 ENTRYPOINT

    类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独
    的可实行程序
    与CND差异的是,由这个指令启动的程序不会被docker run 命令行指定的参数所覆盖
    而且,这些命令行参数会被当做参数通报给ENTRYPOINT指定的程序
    利用格式:
    1. ENTRYPOINT <command>
    2. ENTRYPOINT ["<executable>","<param1>","<param2>"]
    复制代码
    docker run 命令传入的命令参数会覆盖CMD指定的内容而且附加到ENTRYPOINT
    命令末了作为其参数利用
    Dockerfile文件中也可以存在多个此指令,但仅有末了一个生效!
    在docker run时,利用--entrypoint string选项通报的命令 可以覆盖Dockerfile中
    界说的ENTRYPOINT指令
    怎样让Nginx设置文件吸收参数
    创建一个脚本:
    1. #!/bin/bash
    2. #
    3. cat > /etc/nginx/conf.d/www.conf <<EOF
    4.  server {
    5.         server_name ${HOSTNAME};
    6.         listen ${IP:-0.0.0.0}:${PORT:-80};
    7.         root ${ROOT:-/web/html};
    8. }
    9. EOF
    10. exec "$@"
    11. chmod +x nginx-conf.sh
    复制代码
    Dockerfile文件:
    1. FROM xxx
    2. ENV ROOT='/web/html/'
    3. ADD index.html ${ROOT}
    4. ADD nginx-conf.sh /bin/nginx-conf.sh
    5. CMD ["/usr/sbin/nginx","-g","daemon off;"]
    6. ENTRYPOINT ["/bin/nginx-conf.sh"]
    7. docker run --name b1 --rm -P -e "PORT=8080" [镜像ID]
    复制代码
    注意:必须利用双引号!!!
    ................................................................................

    12 USER命令:

    用于指定运行image时的或运行Dockerfile中的任何RUN,CMD或ENTRYPOINT
    指令指定的程序时的用户名或UID
    默认环境下,container的运行身份为root
    格式:
    USER <UID>|<UserName>
    必要注意的是<UID>可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效
    UID否则docker run命令将运行失败!
    必须要在容器中的/etc/passwd文件中个存在
    ....................................................................

    13 HEALTHCHECK

    康健状态监测
    HEALTHCHECK NONE --不要做监测
    常用选项:
    --interval=DURATION 默认30秒 --多长时间监测一次
    --timeout=DURATION 默认30秒 --监测超时时间
    --start-period=DURATION --当docker容器启动后,耽误多长时间才康健查抄
    默认0秒
    --retries=N 默认3次
    默认查抄多少次在以为失败
    响应值:
    0--成功
    1--失败
    2--自界说
    应用示例:
    1. HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit1
    复制代码
    Dockerfile中应用:
    1. HEALTHCHECK --start-period=3s CMD wget -O - -q http://{IP:-0.0.0.0}:${PORT:-80}/
    复制代码
    也可以在docker run中界说:
    1. --health-cmd string            
    2. --health-interval duration      
    3. --health-retries int           
    4. --health-start-period duration  
    5. --health-timeout duration   
    复制代码
    .................................................................

    14 SHELL指令:
    1. ["cmd","/S","/C"] --windons
    复制代码
    ...........................................................

    15 STOPSIGNAL命令:
    STOPSIGNAL 信号名称
    界说制止命令的信号!
    SIGKILL --9信号
    .............................................................

    16 ARG参数:

    用于docker build 的过程中利用
    可以被--buil-arg当做参数通报过来!
    具体应用:
    1. ARG auther=tim
    2. LABLE maintainer=${auther}
    3. docker build --build-arg auther=tom -t xxx ./
    复制代码
    在dockerfile中存在的arg变量,假如在docker build 时也
    设置了--build-arg变量,这样最终以命令行界面的变量值为
    最终值!
    .................................................................

    17 ONBUILD

    用于在dockerfile中界说一个触发器
    dockerfile用于build映像文件,此映像文件亦可作为base image被另一个
    dockerfile用作from指定的参数,并以之构建新的影响文件
    在后面的这个dockerfile中的from指定在build过程中被实行时,将会触发
    创建其base image的dockerfile文件的ONBUILD指定界说的触发器
    格式:
    ONBUILD 要实行的Dockerfile指令
    只管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套
    且不会触发from和maintainer指令
    利用包罗onbuild指定的dockerfile构建的镜像应该利用特别的标签
    例如ruby:2.0-onbuild
    在onbuild指令中利用add或copy指令硬格外小心,由于构建过程的上下文
    在缺少指定的源文件时会失败!
    会在别人引用这个镜像时实行!并不会在首次build过程实行

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作