zoukankan      html  css  js  c++  java
  • (干货)构建镜像之Dockerfile

    Dockerfile是一个文本文件,记录了镜像构建的所有步骤。

    饭提示:学习Dockerfile构建镜像,就是在学习Dockerfile文件构建的命令+shell脚本语句

     

    Dockerfile简单介绍

      Docker可以使用Dockerfile的内容来自动构建镜像。Dockerfile是一个文件,其中有创建镜像、运行指令等一系列的命令,且每行只支持一个运行命令。

    Docker file分为四部分组成:

      基础镜像信

      维护者信息

      镜像操作指令

      容器启动时执行指令

      dockerfile指令忽略大小写,建议大写,#作为注释,每行只支持一条指令,指令可以带多个参数。

    dockerfile指令有:

      构建指令:用于构建image,其指定的操作不会在运行image的容器中执行。

      设置指令:用于设置image的属性,其指定的操作会在运行image的容器中执行。

    Dockerfile指令

    Dockerfile指令一共有以下种:

    1、FROM

      用来指定基础镜像,然后通过在基础镜像上构建新的镜像,基础镜像一般有远程或本地仓库。并且Dockerfile文件第一行必须的FROM指令,如果一个Dockerfile需要创建多个镜像,可以使用多个FROM指令。

    #具体使用用法如下:

      FROM < image_name >   #默认是latest版本

      FROM <image:version>  #指定版本

    eg:

    FROM mysql:5.6

     

    2、MAINTAINER

      指定镜像的创建者信息

    #具体使用法如下:

      MAINTAINER < name >

    eg:

    MAINTAINER fanfan

     

    3、RUN

      运行所有基础镜像能支持的命令,同样也可以使用多条RUN指令,可以使用来换行

    #具体使用法如下:

     备注:# 由shell启动,Linux默认为`/bin/sh -c`,Windows默认为`cmd /S /C`

      RUN < command >                   #shell启动

      RUN ["executable", "param1", "param2" ... ] (exec form) 

    eg:

    RUN yum -y update

     

    RUN ["/etc/execfile", "arg1", "arg1"]

     

    4、CMD

      用于容器启动时的指定操作,它可以是命令,也可以是脚本,但只执行一次,如果有多个,默认只会执行最后一个。

    #具体使用法如下:

      CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐 

      CMD command param1 param2,在/bin/sh上执行 

      CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。

    eg:

    CMD echo "This is a test." | wc -

    CMD ["/usr/bin/wc","--help"]

     

    5、EXPOSE

      指定容器的端口映射(容器与物理机),运行容器时加上-p参数指定EXPOSE设置的端口。EXPOSE可以设置多个端口号,相应地运行容器配套多次使用-p参数。可以通过docker port +容器需要映射的端口号和容器ID来参考宿主机的映射端口。

    #具体使用法如下:

      EXPOSE <port> [port1 , port2 ............]

    eg:

    EXPOSE 80 443

    EXPOSE 8080

    例如-p 3307:3306将容器内的3306绑定到本机的3307

     

    6、ENV

      在镜像中用于设置环境变量的,然后RUN命令可以使用此设置的环境变量,在容器启动后也以通过docker inspect查看环境变量,可以通过docker run --env key=value来设置或修改环境变量。

    #具体使用法如下:

      ENV <key> <value>

      ENV <key>=<value> ...

    eg:

    ENV JAVA_HOME /usr/local/jdk

     

    ENV myName="John Doe"

    myDog=Rex The Dog

    myCat=fluffy

    等同于

    ENV myName John Doe

    ENV myDog Rex The Dog

    ENV myCat fluffy

     

    7、ADD

      (1)、复制指定的源文件、目录、URL到容器的指定目录中。所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0。

      (2)、如果源是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;

      (3)、如果源文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);

        identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压。

      (4)、如果源是文件且目标目录中不使用斜杠结束,则会将目标目录视为文件,源的内容会写入目标目录;饭:可以理解成目标目录变为文件了。

      (5)、如果源是文件且目标目录中使用斜杠结束,则会源文件拷贝到目标目录下。

    #具体使用法如下:

      ADD <> <目标>

    eg:

    ADD hom* /mydir/ # 添加所有以"hom"开头的文件

    ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"

    ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/

    ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/

    ADD test /absoluteDir  # 添加 "test" 到 / 下,并重命名为absoluteDir

     

    8、COPY(同ADD,只是不会解压文件)

      复制本地主机的源(默认为Dockerfile所在的目录)到容器中的目标中,目标路径不存在时会自动创建。

    #具体使用法如下:

      COPY <源> <目标>

      COPY web/index.html  /var/web/

      路径必须是绝对路径,如果不存在,会自动创建对应目录

      路径必须是Dockerfile 所在路径的相对路径

      如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制

     

    9、ENTRYPOINT

      指定容器启动后执行的命令,多行只执行最后一行。并且不可被docker run提供的参数覆盖。

    #具体使用法如下:

      ENTRYPOINT "command" "param1" "param2"  (shell内部命令)

      ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)

    eg:

    FROM ubuntu

    ENTRYPOINT ["top", "-b"]

    CMD ["-c"]

     

    当启动容器后,你将直接看到相当于运行了top -b -c

    要进一步查看,你可以直接使用命令docker exec -it test ps aux

    相当于使用了docker exec top -b -it test ps aux

     

    10、VOLUME

      创建一个可以从本地主机或其它容器挂载的挂载点,一般用于存放数据。与docker run -v也可以实现此功能。

      例如-v ~/opt/data/mysql:/var/lib/mysql将本机的~/opt/data/mysql和容器内的/var/lib/mysql做持久化关联

      容器启动时会加载,容器关闭后会回写。

    #具体使用法如下:

      VOLUME  [directory_name]

    eg:

    VOLUME ["/data"]

    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

     

    11、USER

      指定容器运行时使用的用户或UID,后面RUN、CMD、ENTRYPIONT都会使用此用户来运行命令。

    #具体使用法如下:

      USER [username/uid]

    eg:

    USER 123 或 USER git

     

    12、WORKDIR

      指定RUN、CMD、ENTRYPIONT指定的命令的运行目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR  /data WORKDIR work。最终的路径就是/data/work。path路径也可以是环境变量。

    #具体使用方法如下:

      WORKDIR [path]

    eg:

    WORKDIR /a (这时工作目录为/a)

    WORKDIR b (这时工作目录为/a/b)

    WORKDIR c (这时工作目录为/a/b/c)

     

    13、ONBUILD

      配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。就是,这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令。

    #具体使用法如下:

      ONBUILD [INSTRUCTION]

     

    14、LABEL

      给镜像添加信息。使用docker inspect可查看镜像的相关信息

      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."

    当你在命令行执行docker inspect name时,会发现时key velue键值对类型的。

     

    15、ARG

      由外部启动时必须传入的参数,在容器启动时用--build-arg传递参数

      指定于外界交互的端口,在容器启动时用-p传递参数

      例如--build-arg CONT_IMG_VER=v2.0.1

    eg:

    FROM ubuntu
    ARG CONT_IMG_VER
    ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}
    RUN echo $CONT_IMG_VER

      有些默认参数,无需指定,也不用使用``传递,可直接传参

      HTTP_PROXY

      http_proxy

      HTTPS_PROXY

      https_proxy

      FTP_PROXY

      ftp_proxy

      NO_PROXY

      no_proxy

  • 相关阅读:
    Java DVD管理项目
    Java 幸运抽奖项目
    VS中C#读取app.config数据库配置字符串的三种方法(转)
    IE浏览器让人呕吐的事情!
    你不知道的Javascript小结
    sdfdfd
    mvc中viewData和TempData的区别
    ajax最头疼的问题浏览器兼容
    javascript事件冒泡和捕获
    C# 模拟自动登录的一种简单方式
  • 原文地址:https://www.cnblogs.com/zzf0305/p/9613568.html
Copyright © 2011-2022 走看看