zoukankan      html  css  js  c++  java
  • dockerfile创建镜像

    dockerfile用来快速创建自定义镜像

    基本结构

    dockerfile分为部分:基础镜像信息,维护者信息,镜像操作指令,容器启动时执行指令

    一开始必须指明所基于的镜像名称-》维护者信息-》镜像操作指令(RUN)->运行容器时的操作命令(CMD)

    指令说明

    FROM
    
     
    
    功能为指定基础镜像,并且必须是第一条指令。
    
    如果不以任何镜像为基础,那么写法为:FROM scratch。
    
    同时意味着接下来所写的指令将作为镜像的第一层开始
    
     
    
    语法:
    
    FROM <image>
    FROM <image>:<tag>
    FROM <image>:<digest> 
    三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest
    RUN
    
     功能为运行指定的命令
    
    RUN命令有两种格式
    
    1. RUN <command>
    2. RUN ["executable", "param1", "param2"]
    第一种后边直接跟shell命令
    
    在linux操作系统上默认 /bin/sh -c
    
    在windows操作系统上默认 cmd /S /C
    
    第二种是类似于函数调用。
    
    可将executable理解成为可执行文件,后面就是两个参数。
    
    每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像
    
    两种写法比对:
    
    RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
    RUN ["/bin/bash", "-c", "echo hello"]
    注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.
    
     多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。
    
    RUN书写时的换行符是
    CMD
    
     
    
    功能为容器启动时要运行的命令
    
    语法有三种写法
    
    1. CMD ["executable","param1","param2"]
    2. CMD ["param1","param2"]
    3. CMD command param1 param2
    第三种比较好理解了,就时shell这种执行方式和写法
    
    第一种和第二种其实都是可执行文件加上参数的形式
    
     
    
    举例说明两种写法:
    
    CMD [ "sh", "-c", "echo $HOME" 
    CMD [ "echo", "$HOME" ]
    补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。
    
    原因是参数传递后,docker解析的是一个JSON array

    每个Dockerfile只能有一个CMD命令。如果指定了多条指令,只有最后一条会被执行
    如果用户启动容器时手动指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令

    LABEL
    
    功能是为镜像指定标签
    
     
    
    语法:
    
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
     一个Dockerfile种可以有多个LABEL,如下:
    
    LABEL "com.example.vendor"="ACME Incorporated"
    LABEL com.example.label-with-value="foo"
    LABEL version="1.0"
    LABEL description="This text illustrates 
    that label-values can span multiple lines."
    说明:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
    MAINTAINER
    
    指定作者
    
    语法:
    
    MAINTAINER <name>
    EXPOSE
    
    功能为暴漏容器运行时的监听端口给外部
    
    但是EXPOSE只是启动声明作用,并不会使容器访问主机的端口
    
    如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数
    ENV
    
    功能为设置环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在
    
    语法有两种
    
    1. ENV <key> <value>
    2. ENV <key>=<value> ...
    两者的区别就是第一种是一次设置一个,第二种是一次设置多个

    ADD
    一个复制命令,把文件复制到景象中。 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。 语法如下: 1. ADD <src>... <dest> 2. ADD ["<src>",... "<dest>"] <dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径 <src>可以是一个本地文件或者是一个本地压缩文件,还可以是一个url 如果把<src>写成一个url,那么ADD就类似于wget命令 如以下写法都是可以的: ADD test relativeDir/ ADD test /relativeDir ADD http://example.com/foobar / 尽量不要把<scr>写成一个文件夹,如果<src>是一个文件夹了,复制整个目录的内容,包括文件系统元数据
    COPY
    
    看这个名字就知道,又是一个复制命令
    
    语法如下:
    
    1. COPY <src>... <dest>
    2. COPY ["<src>",... "<dest>"]
    与ADD的区别
    
    COPY的<src>只能是本地文件,其他用法一致
  • 相关阅读:
    LeetCode5654. 盒子中小球的最大数量
    LeetCode40. 组合总和 II
    LeetCode39. 组合总和
    LeetCode17. 电话号码的字母组合
    Leetcode216. 组合总和 III
    eclipse相关使用
    matlab符号的含义
    matlab矩阵相关的笔记
    vi编辑器
    Linux 环境变量
  • 原文地址:https://www.cnblogs.com/Michael2397/p/7289865.html
Copyright © 2011-2022 走看看