美文网首页
Dockerfile 说明

Dockerfile 说明

作者: coding400 | 来源:发表于2019-10-30 16:19 被阅读0次

    FROM

    FROM <image> [AS <name>]
    
    FROM <image>[:<tag>] [AS <name>]
    
    FROM <image>[@<digest>] [AS <name>]
    
    

    FROM 指令 初始化一个新的构建阶段,为随后的指令设置了基础镜像。因此一个有效的Dockerfile 文件必须是以 FROM 指令开始的。该 镜像可以是任何有效的镜像,从公共存储库中提取图像特别容易开始。

    RUN

    RUN <command>
    
    RUN ["executable","param1","param2"]
    

    RUN 指令将执行多个命令在当前镜像的顶部的新的一层,同时提交执行的结果。这个结果将被用做Dockerfile 的下一步

    CMD

    CMD ["executable","param1","param2"] (exec形式,这是首选形式)
    CMD ["param1","param2"] (作为 ENTRYPOINT 的默认值)
    CMD command param1 param2 (shell 脚本形式)
    

    一个 Dockerfile 文件中只能有一个 CMD 指令,如果你使用了多个 CMD 指令,那么只有最后一个 CMD 指令会生效。
    一个 CMD 指令的主要目是为执行中的 container 容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定一条ENTRYPOINT 指令

    注意

    • 如果CMD用于提供ENTRYPOINT 指令的默认参数,则CMD和ENTRYPOINT指令均应使用JSON数组格式指定

    • exec形式被解析为JSON数组,这意味着您必须在单词周围使用双引号(“)而非单引号(')

    • 与 shell 形式不同,exec 不会调用 命令 shell,这意味着普通的 shell 进程不会发生,如:
      CMD["echo", "HOME"] 不会改变环境变量HOME,如果你也想使用 exec 方式执行 shell ,可以这样:CMD["sh","-c" ,"echo $HOME"]

    • 如果用户指定了参数,docker run 则它们将覆盖中指定的默认参数CMD。

    • 请勿RUN与混淆CMD。RUN实际上在启动阶段运行命令并提交结果;CMD在启动过程中不执行任何操作,但在启动之后执行

    LABEL

    LABEL <key>=<value> <key>=<value> <key>=<value> ...
    

    该LABEL指令将元数据添加到镜像。 LABEL是键值对。要在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."
    

    EXPOSE

    EXPOSE <port>[<port>/<protocol>...]
    

    EXPOSE指令通知Docker容器在运行时监听指定的网络端口。您可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。

    该EXPOSE指令实际上并未发布端口。它充当构建映像的人员和运行容器的人员之间的一种** 文档类型 ,有关打算发布哪些端口的信息。要在运行容器时实际发布端口,请使用 -p标记 docker run 来发布和映射一个或多个端口,或者使用-P标记来发布所有公开的端口并将它们映射到高阶端口 **。

    默认, EXPOSE 指令使用 TCP 协议. 你也可以指定 UDP:

    EXPOSE 80/udp
    

    同时指定 TCP 和 UDP, 包括两行:

    EXPOSE 80/tcp
    EXPOSE 80/udp
    

    无论 EXPOSE 如何设置,你都需要在运行时使用 -p 来重写

    docker run -p 80:80/tcp -p 80:80/udp ...
    

    ENV

    ENV <key> <value>
    ENV <key>=<value> ...
    

    ENV 指令将环境变量 <key> 设置为 <value> 。此值将在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可替换

    ENV 有两种形式。第一种形式 ENV <key> <value> 会将一个变量设置为一个值。第一个空格之后的整个字符串将被视为 <value> ,包含空格字符。第二种形式 ENV <key>=<value> .. 允许一次设置多个变量。

    例如:

    ENV myName="John Doe" myDog=Rex\ The\ Dog \
        myCat=fluffy
    
    

    ENV myName John Doe
    ENV myDog Rex The Dog
    ENV myCat fluffy
    

    将在最终镜像中产生相同的结果

    ADD

    ADD [--chown=<user>:<group>] <src>... <dest>
    ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] (此格式对于包含空格的路径是必需的)
    

    ADD 命令用于从 <src> 中复制 新文件、目录或远程文件的 URLs ,并将它们添加到该路径的镜像文件系统中<dest>。
    <src>可以指定多个资源,但是如果它们是文件或目录,则将其路径解释为相对于构建上下文源的路径。每个都<src>可能包含通配符
    如:

    ADD hom* /mydir/        # adds all files starting with "hom"
    ADD hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"
    

    <dest>是一个绝对路径,或相对于一个路径WORKDIR,到其中的源将在目标容器内进行复制。

    ADD test relativeDir/          # adds "test" to `WORKDIR`/relativeDir/
    ADD test /absoluteDir/         # adds "test" to /absoluteDir/
    
    

    ** 注意 **:

    • 目录本身不被复制,仅被复制其内容
    • 如果<src>是任何其他类型的文件,则将其及其元数据一起单独复制。在这种情况下,如果<dest>以斜杠结尾/,则将其视为目录,并将其内容<src>写入<dest>/base(<src>)
    • 如果<src>直接或由于使用通配符而指定了多个资源,则该资源<dest>必须是目录,并且必须以斜杠结尾 /
    • 如果<dest>不以斜杠结尾,则将其视为常规文件,并将其内容<src>写入<dest>

    COPY

    COPY [--chown=<user>:<group>] <src>... <dest>
    COPY [--chown=<user>:<group>] ["<src>",... "<dest>"] (此格式对于包含空格的路径是必需的)
    

    COPY指令复制新文件或目录<src> ,并将它们添加到路径中容器的文件系统中<dest>。<src>可以指定多个资源,但是文件和目录的路径将被解释为相对于构建上下文的源,每个都<src>可能包含通配符

    ENTRYPOINT

    ENTRYPOINT ["executable", "param1", "param2"] (exec 形式,首选)
    ENTRYPOINT command param1 param2 (shell 形式)
    

    ENTRYPOINT 允许您配置一个可执行的运行中的容器。

    docker run -i -t --rm -p 80:80 nginx
    

    docker run <image> 命令将会追加在 exec 形式的 ENTRYPOINT 命令前,同时将覆盖 CMD 中的参数,这里运行通过 -d 来传递参数给 ENTRYPOINT ,也可通过 docker run --entrypoint xx 来覆盖 ENTRYPOINT

    shell 形式阻止所有 CMD 命令 或 docker run命令行参数

    Dockerfile中,只有最后一条ENTRYPOINT指令才会生效。

    VOLUME

    VOLUME ["/data"]
    

    该VOLUME指令创建具有指定名称的 mount point(挂载点),并将其标记为保存来自本地主机或其他容器的外部 mounted volumes。该值可以是JSON数组,也可以是VOLUME ["/var/log/"]具有多个参数的纯字符串,例如VOLUME /var/log或VOLUME /var/log /var/db

    该docker run命令使用基础映像内指定位置上存在的任何数据初始化新创建的卷

    FROM ubuntu
    RUN mkdir /myvol
    RUN echo "hello world" > /myvol/greeting
    VOLUME /myvol
    

    该Dockerfile生成一个镜像,该镜像导致docker run 创建一个新的挂载点/myvol并将该文件复制 到新创建的 VOLUME 中。

    WORKDIR

    WORKDIR /path/to/workdir
    

    该WORKDIR指令设置工作目录为 RUN,CMD, ENTRYPOINT,COPY和ADD 这些在Dockerfile 中的指令。如果WORKDIR不存在,那么即使以后的任何Dockerfile指令中都没有使用它,也将创建它。

    该WORKDIR指令可以在中多次使用Dockerfile。如果提供了相对路径,则它将相对于上一条WORKDIR指令的路径 。例如:

    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
    

    执行 RUN 指令后的结果为 /a/b/c
    该WORKDIR指令可以解析先前使用设置的环境变量 ENV。您只能使用在中显式设置的环境变量Dockerfile。例如:

    ENV DIRPATH /path
    WORKDIR $DIRPATH/$DIRNAME
    RUN pwd
    

    相关文章

      网友评论

          本文标题:Dockerfile 说明

          本文链接:https://www.haomeiwen.com/subject/riugvctx.html