首页 > 其他分享 >手搓 Docker Image Creator(DIC)工具(01):前言

手搓 Docker Image Creator(DIC)工具(01):前言

时间:2024-03-30 22:29:21浏览次数:17  
标签:脚本 01 Creator Image sh 构建 镜像 Docker Dockerfile

设计并实现一款名为 Docker Image Creator(DIC)的脚本工具,该工具能够高效地利用提供的 Dockerfile 文件,自动化完成从源文件构建定制化镜像的全过程,并无缝集成镜像的功能性运行测试环节,旨在提供一站式的镜像构建与验证解决方案。

1 项目缘由

日常开发中,我常常依赖 Docker Hub 中现成的镜像资源,但有时这些镜像无法满足特定的定制化需求。因此,我计划转向利用 Dockerfile 手动构建符合个人需求的镜像。整个过程涉及 Dockerfile 的编写、编译以及新构建镜像的功能验证,而且这一系列步骤是需要反复进行的,显得相对繁琐,准备采用一种简化的方式来处理这个流程。

考虑到自身需求较为基础,我不打算花费过多时间搜索并评估市面上已有的相关工具。鉴于此,决定动手创建一个简单的自动化脚本来实现这一目标,名称就叫 Docker Image Creator,简称:DIC。由于 Dockerfile 的语法结构直观易懂,此次实现的功能也不算复杂,我选择了 Shell 脚本作为实现工具,它与 Docker 命令结合紧密。这样一来,我可以直接通过编写 Shell 脚本来驱动 Docker 编译 Dockerfile、构建镜像及执行相应的镜像功能测试,从而达到一站式构建与验证的目的。

2 项目核心功能

2.1 Image 构建

该项目借助 Dockerfile 实现自定义镜像的编译过程,确保按照预设配置生成一个新的 image。

2.2 镜像功能验证

为了确认生成的 image 是否具备可用性,我们采用标准的 docker run 命令启动容器实例,对新构建的 image 进行全面的功能性测试。通过观察容器启动状况以及内部服务响应情况,我们可以准确判断 image 是否满足设计要求与实际应用场景的需求。

2.3 建立本地资源库

为了提升镜像构建效率和资源管理规范性,我们可以采取以下措施:将镜像构建过程中所需的全部资源文件进行整理和归档,并将其存储在本地磁盘,构建出一个本地资源库。这样,在进行镜像编译生成的过程中,可以直接从本地资源库中提取所需的资源文件,显著减少网络传输带来的等待时间。
此外,通过这种方式建立本地资源库还有助于进行严格的版本控制,确保每次镜像构建所使用的资源版本一致性,避免因外部资源服务器内容变动导致的不稳定性问题,进而提高整体开发环境和部署流程的可控性和可靠性。

3 项目特点

  • 脚本可执行,不需要安装依赖
  • 支持多个应用并行开发、编译、调试

4 项目结构

项目结构如下:

docker-image-builder —— DIB项目根目录
  |— apps —— 应用集合
  |   |— app1 —— 应用1
  |   |   |— framework —— 框架 framework 的软连接,引入框架在app内部使用
  |   |   |   |— ...【内容略,同根目录下的 framework】
  |   |   |- build.sh —— 构建脚本【调用 framework/scripts/_build.sh 脚本】
  |   |   |- build_run.sh —— 构建并运行的脚步【调用 framework/scripts/_build_run.sh 脚本】
  |   |   |— config.sh —— 配置脚本
  |   |   |— Dockerfile
  |   |
  |   |— app2 —— 应用2
  |   |   |— ...
  |   |   |— ...
  |
  |— framework —— 框架【正式运行时设置为只读,避免被改写】
  |   |— resources —— 资源集合
  |   |   |— runtime —— 运行时资源集合
  |   |   |   |— xxxx —— 供选用的运行时资源
  |   |   |
  |   |   |— install —— 用来被 image 从本地安装的资源集合
  |   |       |— xxxx —— 供选用的安装资源
  |   |
  |   |— scripts —— 脚本集合
  |       |— _build.sh —— 真正实现构建的脚本
  |       |— _build_run.sh —— 真正实现镜像构建、并生成容器测试运行的脚本
  |
  |- createApp.sh —— 创建应用的脚本
  |— readme.md —— 说明文件

5 使用简介

5.1 创建应用:

在项目根目录(docker-image-builder)下,执行 createApp.sh 脚本,创建应用。

./createApp.sh appName appVersion

创建应用后,会在 apps 目录下生成应用目录,目录结构同前述的 app1,同时创建一个最简单示例的 Dockerfile,相当于创建 image 的 “Hello World” 示例。

5.2 构建镜像:

在应用目录(如示例中的 app1)下,执行 build.sh 脚本,构建镜像。

5.3 构建并运行镜像:

在应用目录(如示例中的 app1)下,执行 build_run.sh 脚本,构建并运行镜像。

6 项目特别说明

  • 此项目是仅供学习参考,请勿轻易用于生产环境
  • 考虑到 Windows、macOS 是平时工作、学习最常用的操作系统,因此只在 Windows、macOS 上测试
  • 此项目由于是临时发起,边学边写,所以不会很严谨,欢迎拍砖、更希望能引玉
  • 原创码字不易,欢迎评论、点赞、收藏、关注

下一节内容介绍 —— 预备知识
主要简单介绍一下 Docker、Dockerfile 的基本概念,Dockerfile 对的基本语法,Windows 和 macOS 下 Docker 桌面的安装,Docker 镜像的创建和运行测试等。

标签:脚本,01,Creator,Image,sh,构建,镜像,Docker,Dockerfile
From: https://blog.csdn.net/weixin_42398461/article/details/137185206

相关文章

  • C语言day01
    C语言入门环境搭建①mingw64的安装和配置环境变量②vscode安装③vscode配置,需要c/c++扩展,将mingw与vscode联系起来基本代码结构头文件、主函数、返回值程序代码分析#include导入标准库文件主函数main主函数的返回值和返回类型运行流程机制编写源文件——>预......
  • C108 整体二分+树状数组(区修+区查)P3332 [ZJOI2013] K大数查询
    视频链接:C108整体二分+树状数组(区修+区查)P3332[ZJOI2013]K大数查询_哔哩哔哩_bilibili   参考:C82树状数组区修+区查P3372线段树1-董晓-博客园(cnblogs.com)LuoguP3332[ZJOI2013]K大数查询//整体二分+树状数组(区修+区查)O(n*logn*logn)#include<iost......
  • day01-列表
    python基础数据类型:列表list 概念 由一系列元素组成的可变序列容器可变:1.有增删改方法2.所有的操作会直接作用于原数据序列:支持索引和切片操作定义#列表的定义---->list[]#1.直接创建list1=[10,2.3,"hello"]print(list1)print(type(lis......
  • COMP2017 9017 多类型链表数据结构
    COMP20179017课业2到期时间:2024年3月28日23:59这项任务相当于你最终评估的10%任务描述您的任务是创建一个多类型链表数据结构和与之交互的程序任务分为三个任务,必须按顺序完成。第一部分是链表的基本命令语法、创建、删除、查看等。第二部分是通过插入和删除元素来修改现有的列......
  • 灵茶之KMP01
    灵茶之KMP01题目链接https://codeforces.com/problemset/problem/1137/B题目大意输入两个长度均≤\(5*10^5\)的字符串s和字符串t,只包含'0'和'1'。重排s中的字符,使得s中有尽量多的子串等于t。输出重排后的s。如果有多个答案,输出任意一个。思路贪心的思路......
  • 2017天梯赛总决赛:L1-8 矩阵A乘以B
    题目描述给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra​行、Ca​列,B有Rb​行、Cb​列,则只有Ca​与Rb​相等时,两个矩阵才能相乘。输入格式:输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R......
  • day01-字符串方法-逻辑运算符规律
    字符串方法 查询类方法 字符串.index(字符):查询指定字符在整个字符串中第一次出现的位置下标;如果下表不存在则报错字符串.find(字符):查询指定字符在整个字符串中第一次出现的位置下标;如果下表不存在则返回-1字符串.rindex(字符):查询指定字符在整个字符串中最后一次出现的......
  • P2168 [NOI2015] 荷马史诗
    原题链接题解1.该题等价于构建一颗k叉树,每个叶子节点都有一个权值\(leaf_i\),树的权值为\(\sum_{1}^{n}leaf_i\),在使树的权值尽可能小的情况下,使最深的叶子节点的深度也尽可能小,即使数的高度尽可能小这个叫做哈夫曼树2.构建过程如下:每次从队列中取出\(k\)个节点,然后把他......
  • SHELL(01)
    Shell基础Shell:[解释器]在Linux内核与用户之间的解释器程序通常指/bin/bash,这是系统默认解释器负责向内核翻译及传达用户/程序指令相当于操作系统的“外壳”Shell的使用方式交互式指令---------------命令行人工干预智能化程度高逐条解析执行,效率低......
  • NOI2017 蔬菜
    传送门NOI的题果然是非常的难且有意思。还有就是推荐一下command_block的题解。这题的题意比较难。题意:有\(n\)种菜,初始每种菜有\(c_i\)个,单价\(a_i\),如果不出售每天会变质\(x_i\)棵。第一次卖这种菜会获得\(s_i\)的奖励。每天至多卖\(m\)个菜。给出\(q\)次询......