1. 多个连续的 RUN 指令使用 && 连接

    1. Dockerfile 中的每个新 RUN 语句都会在最终映像中生成一个新层
    RUN fetch_package_registry_list
    RUN install_some_package
    
    RUN download_a_really_big_file && \\
        remove_the_really_big_file
    
  2. 使用apt / yum 安装package是固定版本

    FROM ubuntu:22.04
    RUN apt-get update && \\
        apt-get install -y some-package
    
    FROM ubuntu:22.04
    RUN apt-get update && \\
        apt-get install -y some-package=1.2.*
    
  3. 使用 --no-install-recommends 避免安装不必要的包

    1. 当不使用 --no-install-recommends 标志时,apt将安装该包以及包本身的所有推荐包。通过安装不需要的软件包,可能会增加 image的最终大小
    FROM ubuntu:22.04
    RUN apt-get update && \\
        apt-get install -y some-package --no-install-recommends
    
  4. 安装软件包后删除 apt-get 列表

    1. 如果不清理 apt-get 缓存,它会被写入RUN 语句的层中。最终在占据image中的空间。
    FROM ubuntu:22.04
    RUN apt-get update && \\
        apt-get install -y some-package --no-install-recommends && \\
        apt-get clean && \\
        rm -rf /var/lib/apt/lists/*
    
  5. 使用 WORKDIR 代替 RUN cd some-path

    FROM ubuntu:22.04
    WORKDIR /usr/src/app
    RUN git clone [email protected]:depot/some-repo.git
    
  6. 对 CMD 和 ENTRYPOINT 参数使用 JSON 表示法

    FROM ubuntu:22.04
    ENTRYPOINT foo run-server
    
    FROM ubuntu:22.04
    CMD foo run-server
    
    FROM ubuntu:22.04
    ENTRYPOINT ["foo", "run-server"]
    
    FROM ubuntu:22.04
    CMD ["foo", "run-server"]