• windows 2016 dockerfile 以及简单使用


     Docker 引擎包含用于自动创建容器映像的工具。 尽管可以使用 docker commit 命令手动创建容器映像,然而采用自动映像创建过程可获得许多好处,其中包括:

    • 将容器映像存储为代码。
    • 可出于维护和升级的目的快速而精确地重新创建容器映像。
    • 容器映像和开发周期之间的持续集成。

    驱动实现这一自动化过程的 Docker 组件是 Dockerfile,以及 docker build 命令。

    • Dockerfile - 一个文本文件,包含创建新容器映像所需的指令。 这些指令包括对将用作基础的现有映像的标识、将在映像创建过程中运行的命令以及部署容器映像的新实例时将要运行的命令。
    • Docker build - 使用 Dockerfile 并触发映像创建过程的 Docker 引擎命令。

    本文档将介绍将 Dockerfile 用于 Windows 容器的相关内容、讨论语法并详细介绍常用的 Dockerfile 指令。

    本文档将通篇讨论容器映像和容器映像层的概念。 有关映像和映像分层的详细信息,请参阅映像快速入门指南

    有关 Dockerfile 的完整详细信息,请参阅 docker.com 上的 Dockerfile 参考

    Dockerfile 指令

    基本语法

    Dockerfile 的最基本形式十分简单。 下面的示例创建了一个新映像,其中包括 IIS 和一个“hello world”站点。 此示例包含了用于解释每个步骤的注释(通过 # 指示)。 本文的后续部分将对 Dockerfile 语法规则和 Dockerfile 指令进行更详细的讲解。

    请注意,创建的 Dockerfile 不得带扩展名。 要在 Windows 中做到这一点,只需使用所选编辑器创建该文件即可,而不是使用“Dockerfile”符号(包括引号)保存。

    Copy
    none
    # Sample Dockerfile
    
    # Indicates that the windowsservercore image will be used as the base image.
    FROM microsoft/windowsservercore
    
    # Metadata indicating an image maintainer.
    MAINTAINER jshelton@contoso.com
    
    # Uses dism.exe to install the IIS role.
    RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
    
    # Creates an HTML file and adds content to this file.
    RUN echo "Hello World - Dockerfile" > c:inetpubwwwrootindex.html
    
    # Sets a command or process that will run each time a container is run from the new image.
    CMD [ "cmd" ]
    

    有关用于 Windows 的 Dockerfile 的其他示例,请参阅用于 Windows 的 Dockerfile 存储库

    说明

    Dockerfile 指令为 Docker 引擎提供创建容器映像所需的步骤。 这些指令按顺序逐一执行。 以下是有关一些基本 Dockerfile 指令的详细信息。 有关 Dockerfile 指令的完整列表,请参阅 Docker.com 上的 Dockerfile 参考

    FROM

    FROM 指令用于设置在新映像创建过程期间将使用的容器映像。 例如,使用指令 FROM microsoft/windowsservercore 时,所得到的映像派生自 Windows Server Core 基本操作系统映像映像并具有对其的依赖关系。 如果正在进行 Docker 生成过程的系统上不存在指定的映像,Docker 引擎将尝试从公有或私有映像注册表下载该映像。

    格式

    FROM 指令所采用的格式为:

    Copy
     
    FROM <image>
    

    示例

    Copy
     
    FROM microsoft/windowsservercore
    

    有关 FROM 指令的详细信息,请参阅 Docker.com 上的 FROM 参考

    RUN

    RUN 指令指定将要运行并捕获到新容器映像中的命令。 这些命令包括安装软件、创建文件和目录,以及创建环境配置等。

    格式

    RUN 指令所采用的格式为:

    Copy
    none
    # exec form
    
    RUN ["<executable", "<param 1>", "<param 2>"]
    
    # shell form
    
    RUN <command>
    

    Exec 与 Shell 窗体之间的区别在于 RUN 指令执行的方式。 使用 exec 窗体时,指定的程序显式运行。

    以下示例使用了 exec 窗体。

    Copy
    none
    FROM microsoft/windowsservercore
    
    RUN ["powershell", "New-Item", "c:/test"]
    

    检查生成的映像,所运行的命令是 powershell New-Item c:/test

    Copy
    none
    docker history doc-exe-method
    
    IMAGE               CREATED             CREATED BY                    SIZE                COMMENT
    b3452b13e472        2 minutes ago       powershell New-Item c:/test   30.76 MB
    

    为进行比较,下面的示例运行相同的操作,但使用的是 shell 窗体。

    Copy
    none
    FROM microsoft/windowsservercore
    
    RUN powershell New-Item c:test
    

    这将导致运行指令 cmd /S /C powershell New-Item c: est

    Copy
    none
    docker history doc-shell-method
    
    IMAGE               CREATED             CREATED BY                              SIZE                COMMENT
    062a543374fc        19 seconds ago      cmd /S /C powershell New-Item c:	est   30.76 MB
    

    Windows 注意事项

    在 Windows 上,使用具有 exec 格式的 RUN 指令时,反斜杠必须进行转义。

    Copy
    none
    RUN ["powershell", "New-Item", "c:\test"]
    

    当目标程序是 Windows Installer 时,在启动实际(无提示)安装过程之前需要执行一个额外步骤:通过 /x:<directory> 标志,提取安装程序。 此外,需要等待此命令退出。 否则,安装过程将在未安装任何内容的情况下提前结束。 有关详细信息,请参阅以下示例。

    示例

    此示例使用 DISM 在容器映像中安装 IIS。

    Copy
    none
    RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart
    

    此示例安装 Visual Studio 可再发行组件包。 请注意,Start-Process 和 -Wait 参数用于运行安装程序。 以确保在完成安装后再移动到 Dockerfile 中的第二步。

    Copy
    none
    RUN Start-Process c:vcredist_x86.exe -ArgumentList '/quiet' -Wait
    

    有关 RUN 指令的详细信息,请参阅 Docker.com 上的 RUN 参考

    复制

    COPY 指令将文件和目录复制到容器的文件系统。 文件和目录需位于相对于 Dockerfile 的路径中。

    格式

    COPY 指令所采用的格式为:

    Copy
    none
    COPY <source> <destination>
    

    如果源或目标包含空格,请将路径括在方括号和双引号中。

    Copy
    none
    COPY ["<source>", "<destination>"]
    

    Windows 注意事项

    在 Windows 上,目标格式必须使用正斜杠。 例如,以下是有效的 COPY 指令。

    Copy
    none
    COPY test1.txt /temp/
    COPY test1.txt c:/temp/
    

    但是,以下指令不起作用。

    Copy
    none
    COPY test1.txt c:	emp
    

    示例

    此示例将源目录的内容添加到容器映像中一个名为 sqllite 的目录。

    Copy
    none
    COPY source /sqlite/
    

    此示例会将以 config 开头的所有文件添加到容器映像的 c: emp 目录中。

    Copy
    none
    COPY config* c:/temp/
    

    有关 COPY 指令的详细信息,请参阅 COPY Reference on Docker.com(Docker.com上的 COPY 参考)。

    添加

    ADD 指令与 COPY 指令非常类似;但它包含更多功能。 除了将文件从主机复制到容器映像,ADD指令还可以使用 URL 规范从远程位置复制文件。

    格式

    ADD 指令所采用的格式为:

    Copy
    none
    ADD <source> <destination>
    

    如果源或目标包含空格,请将路径括在方括号和双引号中。

    Copy
    none
    ADD ["<source>", "<destination>"]
    

    Windows 注意事项

    在 Windows 上,目标格式必须使用正斜杠。 例如,这些是有效的 ADD 指令。

    Copy
    none
    ADD test1.txt /temp/
    ADD test1.txt c:/temp/
    

    但是,以下指令不起作用。

    Copy
    none
    ADD test1.txt c:	emp
    

    此外,在 Linux 上 ADD 指令将在复制时展开压缩包。 此功能在 Windows 中不可用。

    示例

    此示例将源目录的内容添加到容器映像中一个名为 sqllite 的目录。

    Copy
    none
    ADD source /sqlite/
    

    此示例会将以 config 开头的所有文件添加到容器映像的 c: emp 目录中。

    Copy
    none
    ADD config* c:/temp/
    

    此示例会将 Python for Windows下载到容器映像的 c: emp 目录。

    Copy
    none
    ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe
    

    有关 ADD 指令的详细信息,请参阅 Docker.com 上的 ADD 参考

    WORKDIR

    WORKDIR 指令用于为其他 Dockerfile 指令(如 RUNCMD)设置一个工作目录,并且还设置用于运行容器映像实例的工作目录。

    格式

    WORKDIR 指令所采用的格式为:

    Copy
    none
    WORKDIR <path to working directory>
    

    Windows 注意事项

    在 Windows 上,如果工作目录包含一个反斜杠,则必须对其进行转义。

    Copy
    none
    WORKDIR c:\windows
    

    示例

    Copy
    none
    WORKDIR c:\Apache24\bin
    

    有关 WORKDIR 指令的详细信息,请参阅 Docker.com 上的 WORKDIR 参考

    CMD

    CMD 指令用于设置部署容器映像的实例时要运行的默认命令。 例如,如果该容器将承载 NGINX Web 服务器,则 CMD 可能包括用于启动 Web 服务器的指令,如 nginx.exe。 如果 Dockerfile 中指定了多个 CMD 指令,只会计算最后一个指令。

    格式

    CMD 指令所采用的格式为:

    Copy
    none
    # exec form
    
    CMD ["<executable", "<param>"]
    
    # shell form
    
    CMD <command>
    

    Windows 注意事项

    在 Windows 上,在 CMD 指令中指定的文件路径必须使用正斜杠或已转义的反斜杠 \。 例如,这些是有效的 CMD 指令。

    Copy
    none
    # exec form
    
    CMD ["c:\Apache24\bin\httpd.exe", "-w"]
    
    # shell form
    
    CMD c:\Apache24\bin\httpd.exe -w
    

    但是,以下指令不起作用。

    Copy
    none
    CMD c:Apache24inhttpd.exe -w
    

    有关 CMD 指令的详细信息,请参阅 Docker.com 上的 CMD 参考

    转义字符

    在许多情况下,Dockerfile 指令需要跨多个行;这可通过转义字符完成。 默认 Dockerfile 转义字符是反斜杠 。 由于反斜杠在 Windows 中也是一个文件路径分隔符,这可能导致出现问题。 要更改默认转义字符,可使用一个分析程序指令。 有关分析程序指令的详细信息,请参阅 Parser Directives on Docker.com(Docker.com 上的分析程序指令)。

    以下示例显示使用默认转义字符跨多个行的单个 RUN 指令。

    Copy
    none
    FROM microsoft/windowsservercore
    
    RUN powershell.exe -Command 
        $ErrorActionPreference = 'Stop'; 
        wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:python-3.5.1.exe ; 
        Start-Process c:python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; 
        Remove-Item c:python-3.5.1.exe -Force
    

    要修改转义字符,请在 Dockerfile 最开始的行上放置一个转义分析程序指令。 如以下示例所示。

    请注意,只有两个值可用作转义字符: 和 `

    Copy
    none
    # escape=`
    
    FROM microsoft/windowsservercore
    
    RUN powershell.exe -Command `
        $ErrorActionPreference = 'Stop'; `
        wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:python-3.5.1.exe ; `
        Start-Process c:python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; `
        Remove-Item c:python-3.5.1.exe -Force
    

    有关转义分析程序指令的详细信息,请参阅 Escape Parser Directive on Docker.com(Docker.com 上的转义分析程序指令)。

    Dockerfile 中的 PowerShell

    PowerShell 命令

    可使用 RUN 操作在 Dockerfile 中运行 PowerShell 命令。

    Copy
    none
    FROM microsoft/windowsservercore
    
    RUN powershell -command Expand-Archive -Path c:apache.zip -DestinationPath c:
    

    REST 调用

    当从 Web 服务收集信息或文件时,PowerShell 与 Invoke-WebRequest 命令会很有用。 例如,如果要构建包括 Python 的映像,可以使用下面的示例。 请考虑将 $ProgressPreference 设置为 SilentlyContinue,从而实现更快的下载速度。

    Copy
    none
    FROM microsoft/windowsservercore
    
    RUN powershell.exe -Command 
      $ErrorActionPreference = 'Stop'; 
      $ProgressPreference = 'SilentlyContinue'; 
      Invoke-WebRequest https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:python-3.5.1.exe ; 
      Start-Process c:python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; 
      Remove-Item c:python-3.5.1.exe -Force
    

    Invoke-WebRequest 也适用于 Nano Server

    在映像创建过程期间,还可以通过 .NET WebClient 库使用 PowerShell 下载文件。 这可以增加下载性能。 下面的示例使用 WebClient 库下载 Python 软件。

    Copy
    none
    FROM microsoft/windowsservercore
    
    RUN powershell.exe -Command 
      $ErrorActionPreference = 'Stop'; 
      (New-Object System.Net.WebClient).DownloadFile('https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe','c:python-3.5.1.exe') ; 
      Start-Process c:python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; 
      Remove-Item c:python-3.5.1.exe -Force
    

    Nano Server 中当前不支持 WebClient

    PowerShell 脚本

    在某些情况下,执行这样的操作可能会有所帮助:将脚本复制到映像创建过程期间使用的容器中,然后从该容器内运行脚本。 请注意 - 这会限制任何映像层缓存,并降低 Dockerfile 的可读性。

    此示例使用 ADD 指令将脚本从生成计算机复制到容器中。 然后,此脚本使用 RUN 指令运行。

    Copy
     
    FROM microsoft/windowsservercore
    ADD script.ps1 /windows/temp/script.ps1
    RUN powershell.exe -executionpolicy bypass c:windows	empscript.ps1
    

    Docker Build

    创建 Dockerfile 并将其保存到磁盘后,即可运行 docker build 以创建新映像。 docker build 命令采用几个可选参数和指向 Dockerfile 的路径。 有关 Docker Build 的完整文档,包括所有生成选项的列表,请参阅 build Reference on Docker.com(Docker.com 上的 Build 参考)。

    Copy
    none
    Docker build [OPTIONS] PATH
    

    例如,以下命令将创建名为“iis”的映像。

    Copy
    none
    docker build -t iis .
    

    生成过程启动后,输出将指示状态,并返回任何引发的错误。

    Copy
    none
    C:> docker build -t iis .
    
    Sending build context to Docker daemon 2.048 kB
    Step 1 : FROM micrsoft/windowsservercore
     ---> 6801d964fda5
    
    Step 2 : RUN dism /online /enable-feature /all /featurename:iis-webserver /NoRestart
     ---> Running in ae8759fb47db
    
    Deployment Image Servicing and Management tool
    Version: 10.0.10586.0
    
    Image Version: 10.0.10586.0
    
    Enabling feature(s)
    The operation completed successfully.
    
     ---> 4cd675d35444
    Removing intermediate container ae8759fb47db
    
    Step 3 : RUN echo "Hello World - Dockerfile" > c:inetpubwwwrootindex.html
     ---> Running in 9a26b8bcaa3a
     ---> e2aafdfbe392
    Removing intermediate container 9a26b8bcaa3a
    
    Successfully built e2aafdfbe392
    

    其结果是一个新的容器映像,在此示例中名为“iis”。

    Copy
    none
    docker images
    
    REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
    iis                 latest              e2aafdfbe392        About a minute ago   207.8 MB
    windowsservercore   latest              6801d964fda5        4 months ago         0 B
     





  • 相关阅读:
    [java学习点滴]PropertiesUtil 读取properties配置帮助类
    Java快速向数据库中插入大量数据 比如10万条以上
    Java通过IO流输入输出 向文件中存入大量三个属性的值,并通过验证前两个属性输出第三个属性
    JSON 的使用方法
    jQuery easyUI id选择器 类选择器 标签选择器 属性选择器 及DOM对象和jQuery相互之间的转换
    解决request中文乱码问题
    jsp内置对象request使用方法2
    jsp内置对象request的使用方法
    easyui-dialog对话框练习
    使用combobox下拉列表框实现省 市 县 的三级联动
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/6528898.html
Copyright © 2020-2023  润新知