博客
关于我
《容器高手实战: 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/

    你可能感兴趣的文章
    Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
    查看>>
    Node-RED中使用node-red-contrib-image-output节点实现图片预览
    查看>>
    Node-RED中使用node-red-node-ui-iframe节点实现内嵌iframe访问其他网站的效果
    查看>>
    Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
    查看>>
    Node-RED中使用range范围节点实现从一个范围对应至另一个范围
    查看>>
    Node-RED中实现HTML表单提交和获取提交的内容
    查看>>
    Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
    查看>>
    Node-RED中建立TCP服务端和客户端
    查看>>
    Node-RED中建立Websocket客户端连接
    查看>>
    Node-RED中建立静态网页和动态网页内容
    查看>>
    Node-RED中解析高德地图天气api的json数据显示天气仪表盘
    查看>>
    Node-RED中连接Mysql数据库并实现增删改查的操作
    查看>>
    Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
    查看>>
    Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
    查看>>
    Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
    查看>>
    Node-RED怎样导出导入流程为json文件
    查看>>
    Node-RED订阅MQTT主题并调试数据
    查看>>
    Node-RED通过npm安装的方式对应卸载
    查看>>
    node-request模块
    查看>>
    node-static 任意文件读取漏洞复现(CVE-2023-26111)
    查看>>