• Docker学习—DockerFile


    • 前言:

     上一篇文章简单使用了docker 拉取镜像、启动容器、编译镜像;其中编译镜像时,使用到了Dockerfile,那么接下来我们就详细的来说说Dockerfile

    DockerFile是什么:

      Dockerfile 是一个用来构建镜像的文本文件,Dockerfile内容中包含了一条条构建镜像所需的指令和说明。最终采用docker build 命令通过dockerfile中指令构建镜像

    各种指令详情:

    1、From:指定基础镜像(dockerfile第一个指令)

    FROM [--platform=<platform>] <image> [AS <name>]
    OR
    FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
    OR
    FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
    
    例如:
    FROM mysql:5.8

     注意:

    • 有效的Dockerfile必须从FROM指令开始
    • ARG是Dockerfile中唯一可能位于FROM之前的指令
    • FROM可以在一个Dockerfile中多次出现,以创建多个映像或将一个构建阶段用作另一个构建阶段的依赖项
    • 通过FROM指令添加AS name,可以选择为新生成阶段指定名称。该名称可以在后续的FROM和COPY--FROM=<name>指令中使用,以引用在此阶段中构建的镜像。
    • 标记或摘要值是可选的

    2、RUN:构建镜像时执行的命令

    两种方式:
      RUN <command>                                 ##命令在shell中运行,默认情况下/bin/sh -c在Linux或cmd /S /CWindows上运行
      RUN ["executable", "param1", "param2"]      ##exec 方式
    例如:
      RUN ["/bin/bash", "-c", "echo hello"]

     注意:

    • 将在当前图像顶部的新层中执行所有命令,并提交结果
    • JSON格式中,必须转义反斜杠。
      例如:RUN ["c:\windows\system32\tasklist.exe"]  

    3、CMD:构建容器后调用,也就是在容器启动时才进行调用。

    三种格式:
        CMD ["executable","param1","param2"]          ##执行可执行文件,优先
        CMD ["param1","param2"]                        ##设置了    ENTRYPOINT,则直接调用ENTRYPOINT添加参数
        CMD command param1 param2                     ##执行shell内部命令
    例如:
      CMD ["/usr/bin/wc","--help"]

      注意:

    • CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
    • EXEC形式被解析为一个JSON阵列,这意味着必须使用双引号(“)周围的话不单引号(')

    4、LABEL:设置镜像标签

     添加(K-V)形式元数据到镜像中,如果标签值中需要包含空格时,需要设置引号;反斜杠用于换号设置;示例如下:

    LABEL <key>=<value> <key>=<value> <key>=<value> ...
    例如:
      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."

     注意:

    • 镜像中可以有多个LABLE,可以在一行指令中指定多个标签,如以下两种格式:
    LABEL multi.label1="value1" multi.label2="value2" other="value3"
    LABEL multi.label1="value1" 
          multi.label2="value2" 
          other="value3"
    • 可以继承基础镜像中包含的的标签,如果标签已存在时,但值不同;则最近设置的值将覆盖以前的值

    5、MAINTAINER(废弃):设置生成镜像的作者信息,可使用更加灵活的LABEL替代

    MAINTAINER <name>
    例如:
        MAINTAINER <name>
    替代:
        LABEL maintainer="abc"

    6、EXPOSE:指定容器运行时监听指定网络端口;可以设置端口是TCP或UDP,默认TCP;

    语法:
      EXPOSE <port> [<port>/<protocol>...] 例如: EXPOSE 80/tcp EXPOSE 80/udp

     注意:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

    7、ENV:设置环境变量

    语法:
     ENV <key>=<value> ...   ##可以设置多个环境变量,如果key中包含空格,使用""进行标识;反斜杠用于换行  ENV <key> <value>      ##只能设置一个置,不推荐该写法 例如:  ENV MY_NAME="John Doe"  ENV MY_DOG=Rex The Dog  ENV MY_CAT=fluffy

     注意:

    • 从生成的映像运行容器时,使用ENV设置的环境变量将保持不变。
    • 修改ENV:docker run --env <key>=<value>

    8、ADD:将本地文件添加到容器中

    ADD [--chown=<user>:<group>] <src>... <dest>    
    ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] ##包含空格的路径时,使用该方式
    例如:
     ADD test.txt relativeDir/
     ADD test.txt /absoluteDir/

     注意:

    • --chown功能仅在用于构建Linux容器的Dockerfiles上受支持,而在Windows容器上不起作用
    • src可以指定读个资源,但是如果它们是文件或目录,则将其路径解释为相对于构建上下文源的路径。
    • src支持通配符,匹配规则采用Go的 filepath.Match规则完成
    • 目录本身不被复制,仅其内容被复制。
    • 如果<src>是以公认的压缩格式(身份,gzip,bzip2或xz)作为本地tar归档文件,则将其解压缩为目录,来自远程URL的资源不会被解压缩。
    • 如果<src>直接或由于使用通配符而指定了多个资源,则该资源<dest>必须是目录,并且必须以斜杠结尾/
    • 如果<dest>不以斜杠结尾,则将其视为常规文件,并将其内容<src>写入<dest>
    • 如果<dest>不存在,它将与路径中所有缺少的目录一起创建

    9、COPY:复制文件到容器指定目录

    COPY [--chown=<user>:<group>] <src>... <dest>
    COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
    例如:
     COPY test.txt /absoluteDir/
     COPY test.txt relativeDir/

     注意:同ADD指令差不多,区别为以下内容

    • 不会自动解压文件,也不能访问网络资源
    • src不能为网络资源

    10、ENTRYPOINT:配置容器,使其可执行化

    ENTRYPOINT ["executable", "param1", "param2"]    ##(可执行文件, 优先)
    ENTRYPOINT command param1 param2            ##(shell内部命令)
    例如:
    ENTRYPOINT ["top", "-b"]

     CMD和ENTRYPOINT相互作用

    1. Dockerfile应至少指定CMDENTRYPOINT命令之一。

    2. ENTRYPOINT 使用容器作为可执行文件时应定义。

    3. CMD应该用作ENTRYPOINT在容器中定义命令或执行临时命令的默认参数的方式

    4. CMD 当使用替代参数运行容器时,将被覆盖。  

    11、VOLUME:指定持久化目录

    VOLUME ["/data"]
    例如:
     VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"] 

     注意:

    • 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
      • 卷可以容器间共享和重用
      • 容器并不一定要和其它容器共享卷
      • 修改卷后会立即生效
      • 对卷的修改不会对镜像产生影响
      • 卷会一直存在,直到没有任何容器在使用它
    • 基于Windows的容器上的卷:使用基于Windows的容器时:除C盘目录、不存在或空目录
    • 从Dockerfile中更改卷:如果在声明了卷之后有任何构建步骤更改了卷中的数据,则这些更改将被丢弃。
    • SON格式:列表被解析为JSON数组。您必须用双引号(")而不是单引号('括住单词

    12、USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户

    USER <user>[:<group>]
    or
    USER <UID>[:<GID>]

     注意:

    • 使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。
    • 镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
    • 当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

    13、WORKDIR:设置工作目录

    WORKDIR /path/to/workdir

      注意:

    • 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
    • 在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

    14、ARG:构建参数

    ARG <name>[=<default value>]
    例如:
     ARG user1=someuser
     ARG buildno=1 

      注意:

    • ARG 设置的环境变量仅对 Dockerfile 内有效
    • 不建议使用构建变量传递敏感信息,构建变量值在docker history 可以查看
    • 内置Arg变量:
      • HTTP_PROXY
      • http_proxy
      • HTTPS_PROXY
      • https_proxy
      • FTP_PROXY
      • ftp_proxy
      • NO_PROXY
      • no_proxy

    15、ONBUILD:设置镜像触发器

    ONBUILD <INSTRUCTION>
    例如:
     ONBUILD ADD . /app/src
     ONBUILD RUN /usr/local/bin/python-build --dir /app/src 

     注意:

    • 不允许ONBUILD使用链接说明ONBUILD ONBUILD
    • ONBUILD指令可能不会触发FROMMAINTAINER指令

    16、STOPSIGNAL: STOPSIGNAL指令设置将发送到容器以退出的系统调用信号

    STOPSIGNAL signal 

    17、HEALTHCHECK:指定某个程序或者指令来监控 docker 容器服务的运行状态。

    两种形式:
      HEALTHCHECK [OPTIONS] CMD command   (通过在容器内部运行命令来检查容器运行状况)
      HEALTHCHECK NONE             (禁用从基映像继承的任何运行状况检查)
    例如:
      HEALTHCHECK --interval=5m --timeout=3s 
        CMD curl -f http://localhost/ || exit 1

     注意:

    • HEALTHCHECKDockerfile中只能有一条指令。如果您列出多个,则只有最后一个HEALTHCHECK才会生效。

    18、SHELL:允许重写命令的SHELL形式所使用的默认SHELL。Linux上的默认shell为[“/bin/sh”、“-c”];Windows上的默认shell为[“cmd”、“/S”、“/c”]

    语法:
      SHELL ["executable", "parameters"] 例如:   SHELL ["powershell", "-command"]

     注意:

    • SHELL可以出现多次。每个SHELL指令将覆盖所有先前的SHELL指令,并影响所有后续的指令
    • SHELL指令在Windows上特别有用,在Windows上有两个常用且完全不同的本机shell:cmdpowershell

    DockerFile示例:

    #设置基础镜像
    FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
    #设置工作目录
    WORKDIR
    /app #设置监听端口
    EXPOSE
    80
    #设置镜像 FROM mcr.microsoft.com
    /dotnet/core/sdk:3.1-buster AS build
    #设置工作目录 WORKDIR
    /src
    #复制文件夹 COPY [
    "cz.IdentityServer/cz.IdentityServer.csproj", "cz.IdentityServer/"] #执行项目还原命令
    RUN dotnet restore
    "cz.IdentityServer/cz.IdentityServer.csproj" #复制文件
    COPY . . WORKDIR
    "/src/cz.IdentityServer"
    #执行编译项目命令
    RUN dotnet build "cz.IdentityServer.csproj" -c Release -o /app/build #执行发布项目 FROM build AS publish RUN dotnet publish "cz.IdentityServer.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app
    #复制发布内容到docker目录 COPY
    --from=publish /app/publish .
    #启动项目 ENTRYPOINT [
    "dotnet", "cz.IdentityServer.dll"]

    参考:https://docs.docker.com/engine/reference/builder/

  • 相关阅读:
    Python 日期和时间
    Docker for Windows 使用入门
    Windows 10 安装 Docker for Windows
    CentOS 7 安装 Docker
    CentOS 7 安装.NET Core 2.0
    Entity Framework Core 2.0 使用代码进行自动迁移
    ASP.NET Core 使用Redis存储Session
    Entity Framework Core 2.0 使用入门
    Html页面雪花效果的实现
    ASP.NET Core 2.0 支付宝当面付之扫码支付
  • 原文地址:https://www.cnblogs.com/cwsheng/p/13875131.html
Copyright © 2020-2023  润新知