博客
关于我
《容器高手实战: Dockerfile最佳实践》
阅读量:432 次
发布时间:2019-03-06

本文共 1521 字,大约阅读时间需要 5 分钟。

Dockerfile最佳实践指南

一个容器对应一个进程

Docker容器通常应对应一个特定的进程,这意味着一个Docker镜像一般只应包含一个应用的制品包(如.jar文件)。在需要运行多个进程的场景下,应使用容器组(如Docker Compose或Kubernetes Pod)。

选择合适的基础镜像

基础镜像的选用原则

  • 官方镜像优先:优先选择Docker官方提供的基础镜像。
  • 镜像简洁性:基础镜像应提供充分的支持,尽量简化Dockerfile的复杂性。
  • 镜像精简:尽量避免基础镜像中包含不必要的内容。
  • 明确标签:使用指定的版本标签,而非latest标签。

示例

FROM openjdk:8-jdk-stretch

Dockerfile构建优化

最少改动的步骤优先

将最少改动的步骤放在前面,以便重用前面的构建缓存,避免重复构建。Dockerfile的典型构建步骤如下:

  • 选择基础镜像
    FROM openjdk:8-jdk-stretch
  • 安装工具和环境
    RUN apt-get update && apt-get upgrade -y && apt-get install -y git curl \  && rm -rf /var/lib/apt/lists/*
  • 处理应用
    COPY jenkins.sh /usr/local/bin/jenkins.sh
  • 声明入口点
    ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/jenkins.sh"]
  • 暴露端口
    EXPOSE 8080
  • 多阶段构建

    如果需要多阶段构建,可将Dockerfile分为两部分:

  • 构建应用制品包(如.jar文件)
  • 将生成的制品包复制到镜像中
  • 减少镜像层数量

    尽量减少RUNCOPYADD命令的次数,以减少镜像层的数量。例如,安装工具时尽量在一行命令中完成:

    RUN apt-get install -y git curl

    Docker构建上下文优化

    使用.dockerignore文件

    在构建时,Docker会将PATH路径下的所有内容作为上下文传递给Docker Daemon。如果PATH路径包含过多不必要的文件,会导致镜像构建速度变慢。通过.dockerignore文件,可以忽略不需要的文件:

    .git.cache**/*.class*.md

    建议

    将Dockerfile和制品包(如.jar)放置在一个干净的新目录中,再进行构建:

    # docker-build.sh脚本示例#!/bin/bashset -o pipefaildocker build -t my-image .

    环境变量管理

    一次构建,多环境运行

    在Dockerfile中使用ENV指令定义环境变量,并在运行时通过docker run -e指定:

    ENV JENKINS_HOME=/var/jenkins_home

    常见混淆项

    ADDCOPY

    优先使用COPY指令。ADD虽然功能强大,但可以通过命令完成(如curl下载、tar解压)。

    CMDENTRYPOINT

    • CMD:用于指定镜像运行的入口命令,可与ENTRYPOINT同时使用。
    • ENTRYPOINT:用于指定镜像暴露的入口点,优先于CMD生效。

    ARGENV

    • ARG:构建时参数,可通过docker build --build-arg指定。
    • ENV:运行时参数,可通过docker run -e指定。

    最佳实践总结

    通过以上优化,您可以构建出高效、简洁且易于扩展的Docker镜像。遵循Dockerfile最佳实践,可以显著提升镜像构建速度和性能,同时减少镜像层的数量。

    转载地址:http://zavkz.baihongyu.com/

    你可能感兴趣的文章
    OAuth2:项目演示-模拟微信授权登录京东
    查看>>
    OA系统多少钱?OA办公系统中的价格选型
    查看>>
    OA系统选型:选择好的工作流引擎
    查看>>
    OA让企业业务流程管理科学有“据”
    查看>>
    OA项目之会议通知(查询&是否参会&反馈详情)
    查看>>
    Vue.js 学习总结(13)—— Vue3 version 计数介绍
    查看>>
    OA项目之我的会议(会议排座&送审)
    查看>>
    OA项目之我的会议(查询)
    查看>>
    OA项目之我的审批(会议查询&会议签字)
    查看>>
    OA项目之项目简介&会议发布
    查看>>
    ObjC的复制操作
    查看>>
    Object c将一个double值转换为时间格式
    查看>>
    object detection之Win10配置
    查看>>
    object detection训练自己数据
    查看>>
    object detection错误Message type "object_detection.protos.SsdFeatureExtractor" has no field named "bat
    查看>>
    object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
    查看>>
    object detection错误之no module named nets
    查看>>
    Object of type 'ndarray' is not JSON serializable
    查看>>
    Object Oriented Programming in JavaScript
    查看>>
    object references an unsaved transient instance - save the transient instance before flushing
    查看>>