首页 > 其他分享 >在Docker中,docker commit生成的镜像和dockerfile生成镜像有什么区别?

在Docker中,docker commit生成的镜像和dockerfile生成镜像有什么区别?

时间:2024-03-05 09:24:55浏览次数:25  
标签:容器 生成 构建 commit 镜像 docker Dockerfile

在Docker中,docker commit 和基于 Dockerfile 构建镜像的过程和区别主要包括以下几个方面:

1. docker commit 过程与特点:
  1. 过程

    • 启动一个容器,通常基于某个基础镜像。

    • 在容器内部执行各种操作,例如安装软件、修改配置文件等。

    • 使用 docker commit 命令将容器的当前状态保存为新的镜像:

      docker commit -a "<author>" -m "<message>" <container-id-or-name> <repository>:<tag>
      
    • -a 参数指定提交者的名称。

    • -m 参数用来添加提交的说明信息。

    • <container-id-or-name> 是要提交其状态的容器标识符。

    • <repository>:<tag> 指定新镜像的仓库名和标签。

  2. 特点

    • 手动过程:整个镜像创建过程不具有自动化,依赖于用户在容器内进行手工操作。
    • 不透明:创建的镜像不包含构建步骤的具体历史记录,即无法从镜像本身得知是如何一步步构建的。
    • 可能包含无用数据:提交的是容器的所有改动,包括临时文件、缓存等,可能导致镜像含有不必要的数据,增大镜像体积。
    • 维护性较差:由于缺少清晰的构建过程记录,当需要更新或重构镜像时,可能需要重新检查容器内部状态并手动做出相应的调整。
2. Dockerfile 构建镜像过程与特点:
  1. 过程

    • 编写 Dockerfile,这是一个文本文件,里面包含了构建镜像所需的一系列指令。

    • Dockerfile 中的每条指令相当于容器内的一个操作层,如安装软件、拷贝文件、设置环境变量等。

    • 使用 docker build 命令基于 Dockerfile 来构建镜像:

      docker build -t <repository>:<tag> .
      
    • -t 参数用来指定构建出的新镜像的仓库名和标签。

  • . 表示当前目录,即Dockerfile所在的路径。
  1. 特点
    • 自动化构建:Dockerfile 提供了一种声明式、可编程的方式来定义镜像的构建过程,只要Dockerfile不变,每次构建的结果都是确定的。
    • 可重复性:任何人都可以根据同一个Dockerfile重复构建相同的镜像,便于团队协作和CI/CD流程。
    • 可追溯性:Dockerfile 明确记录了镜像的构建步骤,易于理解和审计。
    • 资源优化:通过合理安排Dockerfile中的指令顺序和利用多阶段构建等特性,可以减小最终镜像的大小,只保留必要的组件。

综上所述,docker commit 更适合临时性地捕获容器状态作为新的镜像,而在生产环境和长期开发中,使用Dockerfile构建镜像是更推荐的做法,因为它提供了更高的透明度、可维护性和一致性。

标签:容器,生成,构建,commit,镜像,docker,Dockerfile
From: https://www.cnblogs.com/huangjiabobk/p/18053245

相关文章

  • 在Docker中,本地的镜像文件都存放在哪里?
    在Docker中,镜像(Images)保存在本地文件系统中,具体的保存位置取决于您使用的操作系统。以下是一些常见操作系统的Docker镜像保存位置:Linux:默认情况下,Docker镜像保存在/var/lib/docker/目录下。当您使用dockerpull命令从DockerHub或私有镜像仓库中拉取镜像时,Docker会自动将镜......
  • 在Docker中,docker run指令执行后,生成了哪些进程?
    当执行dockerrun指令后,Docker会启动一个新的容器实例。这个过程中会涉及多个进程和组件的交互。以下是dockerrun指令执行后生成的主要进程和组件:DockerDaemon(守护进程):DockerDaemon是Docker的后台服务,它长期运行并管理Docker容器、镜像、网络和卷等资源。当执......
  • pycharm新建py文件自动生成头部代码
    生成头部文件代码点击查看代码#!/usr/bin/envpython#-*-coding:utf-8-*-#@File:${NAME}.py#@Author:xxxxx#@Date:${DATE}#@Desc:#@Contact:[email protected]按上面,进行设置后,进行新建python文件,即可自动生成头部代码......
  • docker构建镜像
    Howtobuildadockerimage.本项目用于学习使用docker来构建镜像。这里我们使用docker来编译我们的一个c++项目然后生成一个docker镜像,并将镜像上传到自己的docker仓库,最后使用该镜像来运行我们的项目。0.cpp源文件介绍在src文件夹下面有一个cpp文件,实现了整数的加法,我们在......
  • Java List常用方法Stream()简要总结&生成的List去重
    Java中,ArrayList应该是比较常用的一个对象了;那么它的stream()方法大家了解过吗?如果可以熟练使用stream()方法,就可以方便地获取list中元素的某个特定字段、对list中的元素进行筛选、或者把list转成map。参考:https://blog.csdn.net/BHSZZY/article/details/122860048如何获取不重......
  • 关于AI智能生成(AIGC),整理一下你该知道这些
    ​ 什么是AIGC生成式人工智能(Artificial Intelligence Generated Content)定义百度百科生成式人工智能AIGC(Artificial Intelligence Generated Content)是人工智能1.0时代进入2.0时代的重要标志。GAN、CLIP、Transformer、Diffusion、预训练模型、多模态技术、生成算......
  • ULID(Universally Unique Lexicographically Sortable Identifier)是一种用于生成全局唯
    ULID(UniversallyUniqueLexicographicallySortableIdentifier)是一种用于生成全局唯一、可按字典序排序的标识符的格式。ULID结合了时间戳和随机数的特性,旨在提供高性能、低碰撞、可排序和易读的标识符。ULID的主要特点包括:全局唯一性:通过结合时间戳和随机数的方式,ULID可以生......
  • 根据java已经定义好的Class生成DDL SQL
    packagecom.ai.exchange.generator;importcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.annotation.TableField;importcom.baomidou.mybatisplus.annotation.TableId;importcom.baomidou.mybatisplus.annotation.TableName;import......
  • 使用dnSpy反编译DLL修改代码后生成新的DLL
    1.准备完整的DLL文件夹,包含需要引用的DLL2.使用dnSpy打开文件夹内需要修改的DLL,找到要修改的方法,例如: Kingdee.BOS.ServiceHelper.DataCenterService.IsLicControl(Contextctx,StringformId),右键编辑方法. 3.进入修改代码界面,进行代码修改,并添加需要的引用,点击"......
  • python接口自动化系列(14):一键执行生成并打开报告
     本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/18033074需求在前面的篇幅中,查看测试报告,我们要先运行自动化框架(执行pythonmain.py命令)生成result,然后再生成allure-report,最后再打开报告,这样稍显麻烦。有测试小伙伴就问,能不能一键执行生成并打开报告呢?当然可......