• dockerfile简述


    作用

    Dockerfile的内容是一坨可以执行的代码(或者说是指令)(docker的DSL),这些代码使得创建镜像的操作可以复用以及自动化。

    指令格式

    Dockerfile的指令格式很简单:
    INSTRUCTION arguments

    指令是不区分大小写的,但是约定为全部大写。
    Dockerfile中指令的书写顺序就是它们的执行顺序。

    指令

    FROM

    Dockerfile必须以FROM指令开始,FROM指令指定了基础镜像是什么。也就是基于哪个镜像来制作自己的镜像。
    FROM <image name>
    image name的格式一般为"image:tag"

    MAINTAINER

    指定镜像的作者信息:
    MAINTAINER <author name>

    RUN

    在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。
    RUN <command>

    ADD和COPY

    复制文件指令。
    ADD <source> <destination>
    source可以是URL或者是启动配置上下文中的一个文件。
    将文件拷贝到container的文件系统对应的路径
    所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
    如果文件是可识别的压缩格式,则docker会帮忙解压缩。

    • 如果要ADD本地文件,则本地文件必须在 docker build ,指定的目录下
    • 如果要ADD远程文件,则远程文件必须在 docker build ,指定的目录下。比如:
      docker build github.com/creack/docker-firefox
      docker-firefox目录下必须有Dockerfile和要ADD的文件。

    COPY指令功能类似,但是COPY不允许source是URL,同时也不会进行解压。

    CMD和ENTRYPOINT

    提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD/ENTRYPOINT指令。 使用多个CMD/ENTRYPOINT会抵消之前所有的指令,只有最后一个指令生效。 CMD有三种形式:

    CMD ["executable","param1","param2"] (exec form, this is the preferred form)
    CMD command param1 param2 (shell form)
    CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
    

    区别:
    第二种方式会以"/bin/sh -c"形式调用。第三种方式是为ENTRYPOINT指定参数,也就是使用第三种形式时,要有一个ENTRYPOINT指令。

    如果在执行docker run时提供了command,且command和CMD中相同(参数可以不同),则会执行command,不执行CMD中的命令(实际含义就是把CMD中传递param覆盖了)。

    ENTRYPOINT(An ENTRYPOINT allows you to configure a container that will run as an executable)有两种格式:

    ENTRYPOINT ["executable", "param1","param2"] (exec form)
    ENTRYPOINT command param1 param2 (shell form)
    

    区别:
    第二种(shell form)会屏蔽掉docker run时后面加的命令和CMD里的参数;第一种会把docker run后面的参数或CMD里的参数追加给ENTRYPOINT,docker run后面的参数会覆盖掉CMD里的参数。

    例如:

    ...
    ENTRYPOINT ["echo", "param1"]
    

    执行
    docker run -it test param2
    显示param1 param2
    如果是shell form形式,docker run提供的参数就无效。

    两者区别

    ENTRYPOINT和CMD的不同点在于执行docker run时参数传递方式,CMD指定的命令可以被docker run传递的命令覆盖,例如,如果用CMD指定:

    ...
    CMD ["echo"]
    

    然后运行
    docker run CONTAINER_NAME echo foo
    那么CMD里指定的echo会被新指定的echo覆盖,所以最终相当于运行echo foo,所以最终打印出的结果就是:
    foo
    而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖),比如:

    ...
    ENTRYPOINT ["echo"]
    

    然后运行
    docker run CONTAINER_NAME echo foo
    则CONTAINER_NAME后面的echo foo都作为参数传递给ENTRYPOING里指定的echo命令了,所以相当于执行了
    echo "echo foo"
    最终打印出的结果就是:
    echo foo
    另外,在Dockerfile中,ENTRYPOINT指定的参数比运行docker run时指定的参数更靠前,比如:

    ...
    ENTRYPOINT ["echo", "foo"]
    

    执行
    docker run CONTAINER_NAME bar
    相当于执行了:
    echo foo bar
    打印出的结果就是:
    foo bar

    EXPOSE

    指定容器在运行时监听的端口。
    EXPOSE <port> [<port>...]
    该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不使用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤:

    • 首先在Dockerfile使用EXPOSE设置需要映射的容器端口;
    • 然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。
      EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。

    WORKDIR

    切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。
    WORKDIR /path/to/workdir

    ENV

    设置环境变量。
    ENV <key> <value>
    如果不指定value,表示清除key环境变量。

    USER

    使用哪个用户跑container:
    USER <uid>

    VOLUME

    授权访问从容器内到主机上的目录。语法如下:
    VOLUME ["/data"]

    参考文档

    Dockerfile reference
    Docker入门教程(三)Dockerfile
    Docker Dockerfile详解
    Docker学习笔记(3)-- 如何使用Dockerfile构建镜像
    Dockerfile里指定执行命令用ENTRYPOING和用CMD有何不同?
    What is the difference between the COPY and ADD commands in a Dockerfile?

  • 相关阅读:
    8.16集训
    8.15集训
    Educational Codeforces Round 97 (Rated for Div. 2)
    Codeforces Round #679 (Div. 2, based on Technocup 2021 Elimination Round 1)
    尺取法
    Codeforces Round #677 (Div. 3)
    单调队列
    dfs序
    离散化
    [kuangbin带你飞]专题七 线段树
  • 原文地址:https://www.cnblogs.com/cuimiemie/p/6442677.html
Copyright © 2020-2023  润新知