zoukankan      html  css  js  c++  java
  • 解读三组容易混淆的Dockerfile指令

    长话短说,今天分享三组容易混淆的Dockerfile指令, 帮助大家编写更优雅的Dockfile文件、构建更纯净的Docker镜像。

    COPY vs ADD

    COPY、ADD主体功能类似:从指定位置拷贝文件到Docker镜像。

    COPY <src>... <dest>
    ADD <src>... <dest>
    

    COPY 接收src、dest参数,只允许从Docker Engine主机上拷贝文件到Docker镜像;
    ADD也能完成以上工作,但是ADD支持另外两种src:

    1. 文件源可以是URL
    2. 可以从src直接解压tar文件到目的地
    ADD http://foo.com/bar.go /tmp/main.go
    # 从指定地址下载文件,添加到镜像文件系统的/tmp/main.go位置
    ADD http://foo.com/bar.go /tmp/
    # 因为以/结尾,将会引用url中的文件名添加到指定的目录下
    
    
    ADD /foo.tar.gz /tmp/
    # 自动解压主机文件到指定目录
    

    有趣的是,URL下载和自动解压功能不能同时生效: 任何通过URL下载的压缩包文件不会自动解压。

    • 如果拷贝本地文件到镜像,通常使用COPY,因为含义更明确
    • ADD支持URL文件、自动解压到指定目录,这2个特性也很棒

    ARG vs ENV

    ARG、ENV也让人很疑惑的,都是Dockerfile中定义变量的指令。

    ARG用于镜像构建阶段,ENV用于将来运行的容器

    • 生成镜像后,ARG值不可用,正在运行的容器将无法访问ARG变量值。
    ARG  VAR_NAME 5
    # 构建镜像时,可提供--build-arg  VAR_NAME=6修改ARG值。
    
    • ENV主要是为容器环境变量提供默认值,正在运行的容器可访问环境变量(这是将配置传递给应用的好方法):
    ENV VAR_NAME_2 6
    # 启动容器时,可通过docker run -e "VAR_NAME_2=7"或docker-compose.yml提供新的环境变量值来覆盖Dockerfile中设置的ENV值。
    

    一个小技巧: 构建镜像时不能使用命令行参数重写ENV,但是你可以使用ARG动态为ENV设置默认值:

    # You can set VAR_A while building the image or leave it at the default
    ARG VAR_A 5
    # VAR_B gets the (overridden) value of VAR_A
    ENV VAR_B $VAR_A
    

    RUN vs ENTRYPOINT vs CMD

    1. RUN 在新层中执行命令并产生新镜像,主要用于安装新软件包。
    2. ENTRYPOINT 执行程序的启动命令,当您想将容器作为可执行文件运行时使用。
    3. CMD和ENTRYPOINT 都可以提供程序的启动命令;CMD另外一个作用是为执行中的容器提供默认值
    • CMD ["executable","param1","param2"] (可执行形式,最常见)
    • CMD command param1 param2 (脚本形式)
    CMD echo "Hello world"
    # run -it <image> 输出 Hello world
    

    但是当容器以命令启动,docker run -it /bin/bash, CMD命令会被忽略,bash解析器将会运行:root@98e4bed87725:/#

    • CMD ["param1","param2"] (作为ENTRYPOINT指令默认值,此时必须提供ENTRYPOINT指令,且ENTRYPOINT也必须以Json Array形式)
    ENTRYPOINT ["/bin/echo", "Hello"]  
    CMD ["world"]  
    
    # run -it <image> 将会输出 Hello world;
    # run -it <image> earth 将会输出 Hello earth
    

    当打算构建一个可执行的且常驻的镜像,最好选用ENTRYPOINT;
    如果需要提供默认命令参数(可在容器运行时从命令行覆盖),请选择CMD

    Reference

  • 相关阅读:
    SpringMVC学习笔记六:类型转换器及类型转换异常处理
    SpringMVC学习笔记五:HandlerExceptionResolver异常处理
    SpringMVC学习笔记四:SimpleMappingExceptionResolver异常处理
    SpringMVC学习笔记三:Controller的返回值
    SpringMVC学习笔记二:参数接受
    SSH+Ajax实现用户名重复检查(二)
    SSH+Ajax实现用户名重复检查(一)
    Java添加事件的四种方式
    用Java开发一个本地服务管理软件
    Java Web开发中的名词解释
  • 原文地址:https://www.cnblogs.com/JulianHuang/p/13060375.html
Copyright © 2011-2022 走看看