CN116301950B - Docker镜像生成方法、装置、设备和存储介质 - Google Patents
Docker镜像生成方法、装置、设备和存储介质 Download PDFInfo
- Publication number
- CN116301950B CN116301950B CN202310544588.6A CN202310544588A CN116301950B CN 116301950 B CN116301950 B CN 116301950B CN 202310544588 A CN202310544588 A CN 202310544588A CN 116301950 B CN116301950 B CN 116301950B
- Authority
- CN
- China
- Prior art keywords
- code
- branch
- target image
- branch code
- name
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 73
- 238000010276 construction Methods 0.000 claims abstract description 86
- 238000004590 computer program Methods 0.000 claims description 5
- 230000003068 static effect Effects 0.000 description 9
- 238000010586 diagram Methods 0.000 description 6
- 238000011161 development Methods 0.000 description 5
- 238000012545 processing Methods 0.000 description 5
- 230000003111 delayed effect Effects 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 230000006870 function Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/61—Installation
- G06F8/63—Image based installation; Cloning; Build to order
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
一种Docker镜像生成方法、装置、设备和存储介质,该方法包括获取至少一个代码工程的至少两个分支代码;对各分支代码进行工程编译,得到各分支代码的构建产物,并将各构建产物按照预设的目录结构进行存储,得到构建产物集合;基于构建产物集合,生成代码工程的目标镜像;通过预设的目录结构可以将各分支代码的构建产物进行合并,从而基于合并后的构建产物集合将多个分支代码构建到一个目标镜像中,从而可以降低整个系统的部署成本。
Description
技术领域
本公开涉及计算机技术领域,尤其涉及一种Docker镜像生成方法、装置、设备和存储介质。
背景技术
传统软件开发生命周期中,每个软件需要多个运行环境,比如开发环境、测试环境、SIT环境、UAT环境、生产环境等,在目前的Docker镜像部署时,通常需要针对每个运行环境分别构建对应的Docker镜像,并将多个Docker镜像分别部署至公有云Docker容器引擎,也就是说,有多少个Docker镜像就需要在公有云Docker容器引擎中采购多少个容器。
随着软件系统越来越复杂,系统架构为了解耦,将复杂系统拆分为多子系统和多个模块,对模块进行微服务化、微前端化改造,这就导致软件系统中的代码工程数量成倍增长,如果仍采用现有的方式进行Docker镜像部署,需要按代码工程数量*运行环境数量采购容器,这使得容器的采购成本成倍增长,进而导致系统Docker容器化部署成本成倍增长。因此,如何降低多模块多服务的复杂系统Docker容器化部署成本是本领域技术人员亟待解决的技术问题。
发明内容
有鉴于此,本公开提出了一种Docker镜像生成方法、装置、设备和存储介质,可以将系统中至少一个代码工程的多个运行环境的分支代码构建到同一个目标镜像中,从而可以降低整个系统的Docker容器化部署成本。
根据本公开的第一方面,提供了一种Docker镜像生成方法,包括:
获取至少一个代码工程的至少两个分支代码;
对各所述分支代码进行工程编译,得到各所述分支代码的构建产物,并将各所述构建产物按照预设的目录结构进行存储,得到构建产物集合;
基于所述构建产物集合,生成所述代码工程的目标镜像。
在一种可能的实现方式中,在获取代码工程的所述分支代码时,包括:
获取所述分支代码的分支代码信息,并基于所述分支代码信息获取所述分支代码,其中,所述分支代码信息包括所述分支代码所属的代码工程的存储地址、所述代码工程的名称以及所述分支代码的名称。
在一种可能的实现方式中,在获取所述分支代码的分支代码前,还包括:判断所述分支代码对应的目标镜像是否被锁住,在判断所述目标镜像未被锁住的情况下,为所述目标镜像添加排它锁的步骤。
在一种可能的实现方式中,在基于所述构建产物集合,生成所述代码工程的目标镜像时,基于当前构建物产物集合中所存储的所有构建产物实现。
在一种可能的实现方式中,基于所述构建产物集合,生成所述代码工程的目标镜像时,包括:
获取基础镜像、已处理的所述分支代码的配置文件、以及当前构建产物集合中所存储的所有构建产物;
基于所述基础镜像、已处理的所述分支代码的配置文件以及当前构建产物集合中所存储的所有构建产物生成所述代码工程的目标镜像。
在一种可能的实现方式中,在生成所述代码工程的目标镜像后,还包括:释放所述排它锁。
在一种可能的实现方式中,在生成所述代码工程的目标镜像后,还包括:将所述目标镜像推送至预设的镜像仓库。
根据本公开的第二方面,提供了一种Docker镜像生成装置,包括:
分支代码获取模块,用于获取至少一个代码工程的至少两个分支代码;
构建产物集合构建模块,用于对各所述分支代码进行工程编译,得到各所述分支代码的构建产物,并将各所述构建产物按照预设的目录结构进行存储,得到构建产物集合;
目标镜像生成模块,用于基于所述构建产物集合,生成所述代码工程的目标镜像。
根据本公开的第三方面,提供了一种Docker镜像生成设备,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器被配置为执行本公开第一方面所述的方法。
根据本公开的第四方面,提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,其特征在于,所述计算机程序指令被处理器执行本公开第一方面所述的方法。
在本公开提供的Docker镜像生成方法,包括获取至少一个代码工程的至少两个分支代码;对各分支代码进行工程编译,得到各分支代码的构建产物,并将各构建产物按照预设的目录结构进行存储,得到构建产物集合;基于构建产物集合,生成代码工程的目标镜像;通过预设的目录结构可以将系统中至少一个代码工程的多个分支代码的构建产物进行合并,从而基于合并后的构建产物集合将系统中至少一个代码工程的多个分支代码构建到同一个目标镜像中,从而可以降低整个系统的Docker容器化部署成本。
根据下面参考附图对示例性实施例的详细说明,本公开的其它特征及方面将变得清楚。
附图说明
包含在说明书中并且构成说明书的一部分的附图与说明书一起示出了本公开的示例性实施例、特征和方面,并且用于解释本公开的原理。
图1示出根据本公开一实施例Docker镜像生成方法的流程图;
图2示出根据本公开一实施例Docker镜像生成方法的示例流程图;
图3示出根据本公开一实施例Docker镜像生成装置的示意性框图;
图4示出根据本公开一实施例Docker镜像生成设备的示意性框图。
具体实施方式
以下将参考附图详细说明本公开的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。
在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。
另外,为了更好的说明本公开,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本公开同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本公开的主旨。
<方法实施例>
图1示出根据本公开一实施例的Docker镜像生成方法的流程图,该方法由Docker镜像生成装置执行,如图1所示,该方法包括步骤S1100-S1300。
S1100,获取至少一个代码工程的至少两个分支代码。
该代码工程即为实现一项服务所需的代码。举例来说,该代码工程可以是实现软件系统前端服务的全部代码,也可以是实现软件系统后端服务的全部代码,在此不作具体限定。
为了实现一项服务,代码工程中需要配置开发环境、测试环境、SIT环境、UAT环境和生产环境中的至少一种运行环境,实现每种运行环境的代码即为该代码工程的分支代码,即针对于代码工程来说,有多个少运行环境就包括多少个分支代码。举例来说,一个代码工程中包括5种运行环境,则该代码工程具有5个分支代码。
对于一个系统来说,可以包括一个代码工程,也可以包括两个代码工程,还可以包括多个代码工程,在此不作具体限定。在对整个系统进行Docker容器化部署时,需要获取系统中所有的代码工程的所有分支代码,才能最终构建出系统的目标镜像。在获取系统中所有代码工程的所有分支代码时,可以按序获取各代码工程中的各分支代码,也可以同时获取,在此不作具体限定。
举例来说,系统中包括前端服务代码工程和后端服务代码工程,其中,前端代码工程中又包括第一分支代码和第二分支代码,后端代码工程中又包括第三分支代代码和第四分支代码,则在按序获取各代码工程中的各分支代码时,可以先依次获取前端代码工程的第一分支代码和第二分支代代码,然后再依次获取后端代码工程的第三分支代码和第四分支代码。在同时获取各代码工程中的各分支代码时,可以同时获取前端代码工程的第一分支代码和第二分支代代码以及后端代码工程的第三分支代码和第四分支代码。
在一种可能的实现方式中,在获取到各分支代码后,将逐一将各分支代码构建到目标镜像中,且对各分支代码的处理过程均相同,因此,下面以一个分支代码的处理过程为例,对本公开Docker镜像生成方法进行说明。
在一种可能的实现方式中,在获取代码工程的分支代码时,包括:获取分支代码的分支代码信息,并基于分支代码信息获取分支代码,其中,分支代码信息包括分支代码所属的代码工程的存储地址、名称以及分支代码的名称。
在一种可能的实现方式中,在获取分支代码的分支代码信息时,可以基于Webhook实现。具体地,系统的代码工程可以存储在代码仓库中,该代码仓库可以是GitHub(以下统称为Git仓库),也可以是别的代码仓库,在此不作具体限定。针对代码仓库,配置有Webhook,该Webhook的url配置为Docker镜像生成装置的服务入口,这样,Webhook便可以监听分支代码推送事件,并将监听到的分支代码推送事件发送至Docker镜像生成装置。其中,该分支代码推送事件中包括该分支代码信息,这样,Docker镜像生成装置在接收到分支代码发推送事件后便可以通过解析分支代码推送事件获取到当前推送的分支代码信息。
在获取到分支代码信息后,便可以根据分支代码信息拉取对应的分支代码。举例来说,分支代码信息中,代码工程在git仓库的存储地址为:${REPOSITORY_URL},代码工程名称为:${CI_PROJECT_NAME},分支代码名称为:${CI_BRANCH_NAME},则执行shell命令gitclone ${REPOSITORY_URL}&&git checkout ${CI_BRANCH_NAME}&&git pull,即可以由代码仓库中拉取到对应分支代码。
在一种可能的实现方式中,为了提高目标镜像构建的准确性,在获取分支代码前,还包括:判断分支代码对应的目标镜像是否被锁住,在判断目标镜像未被锁住的情况下,为目标镜像添加排它锁的操作。
在该可实现方式中,分支代码信息中还需要配置分支代码所需要构建到的目标镜像的名称(以下统称目标镜像名称),这样,在获取到分支代码信息后便可以基于分支代码信息中的目标镜像名称判断该分支代码对应的目标镜像是否被锁住。此处需要说明的是,本公开是需要将系统中的多个代码工程的多个分支代码构建至同一目标镜像中,因此,针对系统中各代码工程中的各分支代码配置的目标镜像名称均一致。
在一种可能的实现方式中,在基于目标镜像名称判断分支代码对应的目标镜像是否被锁住时,包括:先基于目标镜像名称获取目标镜像的锁信息,再结合目标镜像的锁信息判断目标镜像是否被锁住。其中,该锁信息中包括目标镜像的名称(IMAGE_NAME)、锁状态(status)以及过期时间戳(timeout)中的至少一种。其中,该锁状态用于表征逻辑锁是锁定状态还是释放状态。具体地,在该逻辑锁处于锁定状态时,该锁状态的值可以为1(表示为status:1);在该逻辑锁处于释放状态时,该锁状态值可以是0(表示为status:0)。该过期时间戳用于表征逻辑锁的过期时间。具体地,如果逻辑锁在当前生成后3600s过期,即该逻辑锁失效,则该过期时间戳可以是当前时间戳+3600s(表示为timeout:当前时间戳+3600s)。
具体地,在基于目标镜像名称获取目标镜像的锁信息,并结合目标镜像的锁信息判断目标镜像是否被锁住时,包括:基于目标镜像的名称检索是否存在包括该目标镜像名称的锁信息(即目标镜像的锁信息):若不存在包括该目标镜像名称的锁信息,或者包括该目标镜像名称的锁信息中的锁状态值不为1,或者包括该目标镜像名称的锁信息中的过期时间戳小于当前时间戳,则判断目标镜像未被锁住。在判断目标镜像未被锁住的情况下,执行为目标镜像添加排它锁的操作。若包括该目标镜像名称的锁信息,且锁信息中的锁状态值为1,且锁信息中的过期时间戳大于当前时间戳,则判断目标镜像已被锁住。在判断目标镜像已被锁住的情况下,延迟预设时间后,继续执行判断目标镜像是否被锁住的操作。其中,延迟的预设时间可以根据具体的应用场景进行设置,例如,可以将延迟的预设时间设置为30s,即在判断目标镜像已被锁住的情况下,延迟30s以后,继续执行判断目标镜像是否被锁住的操作。此处需要说明的是,排它锁即为上述锁信息中提到的逻辑锁。
在一种可能的实现方式中,该排它锁可以基于远程字典服务redis实现。具体地,在Docker镜像生成装置上安装node.js redis插件,执行命令npm install ioredis安装远程字典服务redis插件,配置redis服务的地址、端口、用户名和密码,建立Docker镜像生成装置至远程字典服务redis的连接,实例化一个redis实例redisLocker,最后基于实例redisLocker生成目标镜像的排它锁信息并存储至远程字典服务redis。
本实施例中,在判断目标镜像未被锁住的情况下,为目标镜像添加排它锁,在判断目标镜像未被锁住的情况下,延迟预设时间后,继续执行判断目标镜像是否被锁住的操作,通过这样的设置可以在触发一个分支代码的处理操作后,抑制其它分支代码的处理操作,从而可以防止多个分支代码工程并发构建所产生的构建产物数据不一致的问题。同时,锁信息中包的含过期时间戳,在当前时间超过过期时间戳后,该排它锁自动作废,从而可以防止出现死锁的情况。
S1200,对各分支代码进行工程编译,得到各分支代码的构建产物,并将各构建产物按照预设的目录结构进行存储,得到构建产物集合。
续上实施例,在获取到分支代码后,可以执行npm install&&npm run build:${CI_BRANCH_NAME}命令,对名称为${CI_PROJECT_NAME}的代码工程中的名称为${CI_BRANCH_NAME}的分支代码进行工程编译,即可得到该分支代码的构建产物。其中,构建产物中可以包括多个对象,对象的类型可以是文件,也可以是文件夹,在此不作具体限定。
在一种可能的实现方式中,在将分支代码的构建产物按照预设的目录结构进行存储得到构建产物集合时,可以包括以下步骤:
第一,在本地设置名称为 ${WORKING_DIR}的工作目录,并将当前分支代码生成的构建产物输出至该工作目录的dist目录中。此处需要说明的是,本公开中的目录相当于文件夹,将构建产物输出至该工作目录的dist目录中,即将当前分支代码的构建产物输出至名称为${WORKING_DIR}的文件夹中的名称为dist的子文件夹中。
第二,将当前dist目录中的当前分支代码的构建产物按照预设的目录结构上传至FTP服务器中。其中,预设的目录结构可以是代码工程名称/分支代码名称/构建产物。也就是说,在FTP服务器的工作目录下创建以该分支代码所在代码工程的名称命名的第一文件夹,然后在该第一文件夹中创建以该分支代码的名称命令的第二文件夹,最后,将当前分支代码的构建产物上传至该第二文件夹中。具体地步骤可以如下所示:
首先,建立Docker镜像生成装置与FTP服务器的连接。具体地,在Docker镜像生成装置上安装node.js FTP插件,配置好FTP的host地址、端口、账户名及密码,实例化一个FTP客户端对象ftpclient,通过执行ftpclient.connect方法将Docker镜像生成装置连接至FTP服务器。
其次,调用递归方法递归上传构建产物至FTP服务器中,具体步骤如下:
① 调用ftpclient.mkdir方法,在FTP工作目录下创建路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}的文件夹,即,在FTP服务器的工作目录下创建以该分支代码所在代码工程的名称命名的第一文件夹,然后在该第一文件夹中创建以该分支代码的名称命令的第二文件夹,该第二文件夹即为路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}的文件夹。
② 调用path.readdirSync方法,获取当前dist文件夹中构建产物的所有对象;
③ 循环遍历各对象,获取对象类型:
④ 如果对象类型是文件夹,获取当前文件夹路径${subPath};比较当前文件夹路径${subPath}与dist文件夹路径差异,获取两者之间相对路径${relatedPath},通过ftpclient.mkdir方法,在FTP工作目录下路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}文件夹下创建相对路径为${relatedPath的文件夹,即在FTP工作目录下创建路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}/${relatedPath}的文件夹,继续调取上述递归方法,直到将当前文件夹上传至FTP服务器中;
⑤ 如果对象类型是文件,则调用ftpclient.put方法将该文件上传至FTP工作目录下路径为“${CI_PROJECT_NAME}/${CI_BRANCH_NAME}的文件夹中。
在递归结束后,即可以将当前dist文件夹中的构建产物的所有对象按照预设的目录结构上传至FTP服务器中。此处需要说明的是,在进行递归处理时,基于当前对象在dist文件夹中路径参数进行。
举例子来讲,设置d盘为本申请装置工作目录,当前构建的工程分支代码的构建产物被编译至“d:/dist”文件夹中,目录结构层级如下:
首先,在FTP工作目录下创建路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}的文件夹。调用递归算法,传入路径参数“d:/dist”,遍历“d:/dist”目录下所有对象,找到index.html为文件类型,调用ftpclient.put方法将index.html文件至FTP工作目录下路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}的文件夹内;找到第二个对象static为文件夹类型,则在FTP工作目录下路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}的文件夹下创建相对路径为static的文件夹,即在FTP工作目录下创建路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}/static的文件夹;继续调用递归方法,传入参数路径为“d:/dist/static”,遍历“d:/dist/static”目录下所有对象,判断logo.png对象为文件类型,则上传logo.png对象至FTP工作目录下路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}/static的文件夹内,判断js对象为文件夹类型,获取js文件夹相对于“d:/dist”的相对路径为“static/js”,则在FTP工作目录下的路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}的文件夹下创建相对路径为“static/js”的文件夹,即在FTP工作目录下创建路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}/static/js的文件夹,继续执行递归方法,传入参数路径为”d:/dist/static/js”, 找到该路径下的app.js对象是文件类型,上传app.js文件至FTP工作目录下路径为${CI_PROJECT_NAME}/${CI_BRANCH_NAME}/static/js的文件夹下,依此类推将“d:/dist”下所有内容上传至FTP工作目录的“${CI_PROJECT_NAME}/${CI_BRANCH_NAME}”文件夹下。
针对每一代码工程的每一分支代码,其工程编译后的构建产物均会参照上述目录结构上传至FTP服器中,也就是说,每执行完一个分支代码的工程编译操作,构建产物集合中便增加一个分支代码的构建产物。例如,当前已经完成了代码工程中3个分支代码工程的编译工作,则当前构建产物集合中存在3个分支代码的构建产物。也就是说,FTP服务器中的构建产物集合是逐步完善的。
此处需要说明的是,在分支代码是实现Web服务的分支代码,由于Web服务运行依赖于web中间件Nginx,因此,在构建该分支代码的目标镜像时,不仅需要根据分支代码信息拉取分支代码,同时还需要拉取该分支代码的Nginx配置文件。
进一步地,在采用第一递归方法遍历dist目录中构建产物的各对象,并将其按照预设的目录结构上传至FTP服务器中时,还包括,将拉取的分支代码的Nginx配置文件上传至FTP服务器中,其中,Nginx配置文件的名称格式为${CI_PROJECT_NAME} /${CI_BRANCH_NAME} .conf。
此处需要说明的是,分支代码的Nginx配置文件中配置了对外提供服务域名,文件中指定资源文件存储目录结构采用相对Ngninx中间件默认资源目录/工程名称/代码分支名称的编排结构,此处路径与DockerFile中构建物集合存放目录路径保持一致。指定web服务监听80和443端口,server_name主机名为对外提供服务域名。Nginx配置文件示例如下:
此处还需要说明的是,每上传一个分支代码的构建产物,将同时上传该分支代码的Nginx配置文件,也就是说,各分支代码的Nginx配置文件也是逐步上传至FTP服务器中的。
进一步地,在将当前分支代码的构建产物上传至FTP服务器后,将自动清除本地当前dist目录中的构建产物,这样,在对下一分支代码进行工程编译后,便可以将下一分支代码的构建产物存放至dist目录中。
进一步地,在将当前分支代码的构建产物按照预设的目录结构上传至FTP服务器后,还包括:由FTP服务器中下载当前得到的构建产物集合至Docker镜像生成装置,这样便可以获取到当前分支代码对应的构建产物集合。下载构建产物集合可以包括以下步骤:
首先,建立Docker镜像生成装置与FTP服务器的连接。具体连接方式参见上文在此不再赘述。
其次,采用递归方法recursiveFtpDirectory(path),遍历FTP服务器工作目录中的各对象,并下载工作目录下所有内容,具体下载步骤如下:
(1)在本申请装置工作目录下创建路径为artifacts文件夹;
(2)调用ftpclient.list方法获取FTP工作目录下所有对象;
(3)循环遍历对象,获取对象类型:
(4)如果对象类型为文件夹,并获取当前文件夹路径相对于FTP工作目录路径${relatedPath},则在路径为artifacts的文件夹中创建相对路径为${relatedPath}的文件夹,并继续调用递归方法recursiveFtpDirectory(${relatedPath})递归处理当前文件夹,直到将当前文件夹中全部下载至本地路径为artifacts 的文件夹中;
(5)如果对象类型为文件,则将该文件下载至路径为artifacts的文件夹中。
遍历结束后,便可将FTP服务器上的构建产物集合下载至本地的artifacts文件夹中。
举例子来讲,构建产物集合位于FTP工作目录下。文件层级结构如下:
第一次调用递归算法,传入路径参数“/”,遍历FTP工作目录下所有对象,找到第一个对象project1为文件夹类型,在artifacts文件夹下创建相对路径为project1的文件夹即“artifacts/project1”,继续调用递归方法,传入参数为“/project1”,遍历“/project1”目录下的develop对象为文件夹类型,在artifacts文件夹下创建相对路径为“project1/develop”的文件夹即“artifacts/project1/develop”,继续调用递归方法,传入参数为“/project1/develop”,判断目录下index.html对象为文件类型,下载index.html到“artifacts/project1/develop”目录下,依此类推通过递归方法调用将FTP工作目录下所有内容即构建产物集合下载至artifacts文件夹下。
进一步地,在下载构建物集合的同时,还要将FTP服务器上存储的当前所有分支代码对应的Nginx配置文件下载至本地的artifacts子目录中。
S1300,基于构建产物集合,生成代码工程的目标镜像。
在一种可能的实现方式中,在基于构建产物集合,生成代码工程的目标镜像时,基于当前构建物产物集合中所存储的所有构建产物实现。具体包括以下步骤:
首先,获取基础镜像、已处理的分支代码的配置文件和当前构建产物集合中所存储的所有构建产物。其中,基础镜像由镜像仓库中获取,已处理的分支代码的配置文件和当前构建产物集合中所存储的所有构建产物由本装置工作目录下的artifacts子目录中获取。
其次,基于基础镜像、已处理的分支代码的配置文件以及当前构建产物集合中所存储的所有构建产物合生成代码工程的目标镜像。具体地,可以基于预先配置的DockerFile文件实现。其中,DockerFile文件内容可以如下所示:
在基于DockerFile文件生成目标镜像时,可以包括以下步骤:将基础镜像的Nginx配置文件作为目标镜像的底层系统,将当前获取到的构建物集合拷贝到系统/usr/share/Nginx/html目录,将当前获取的Ngninx配置文件拷贝到Ngninx配置文件所在目录/etc/Nginx/conf.d,添加容器启动后自动启动Nginx中间件的配置。执行命令docker build -tfrontend/${IMAGE_NAME}:v1 -f DockerFile ./完成目标镜像的构建。
在一种可能的实现方式中,在生成代码工程的目标镜像后,还包括:释放排它锁的操作。在排它锁基于远程字典服务redis实现的可实现方式中,同样基于远程字典服务redis实现排它锁的释放。具体地,以镜像名称${IMAGE_NAME}作为key,调用redisLocker.set(${IMAGE_NAME},{status:0,timeout:null)释放排它锁。
在一种可能的实现方式中,在释放排它锁后,还包括将目标镜像推送至预设的镜像仓库。具体地,运行docker login命令,输入用户名和密码登录至镜像仓库,执行dockerpush推送当前目标镜像至镜像仓库中。
在一种可能的实现方式中,在将当前目标镜像至镜像仓库中之后,还可以包括发布当前目标镜像的步骤。具体地,获取目标镜像在镜像仓库中的地址,由镜像仓库中拉取目标镜像,并将该目标镜像部署至公有云Docker容器引擎中。其中,该公有云Docker容器引擎可以是公有云Serverless云服务。
重复上述目标镜像过程处理系统中各代码工程中的各分支代码,即可最终将同一系统中各代码工程中的各分支代码均构建到同一个目标镜像中。
在本公开中提供了一种Docker镜像生成方法,包括:获取至少一个代码工程的至少两个分支代码;对各分支代码进行工程编译,得到各分支代码的构建产物,并将各构建产物按照预设的目录结构进行存储,得到构建产物集合;基于构建产物集合,生成代码工程的目标镜像。通过本公开的Docker镜像生成方法可以将多个运行环境的分支代码构建到一个目标镜像中,从而可以降低目标镜像的部署成本。
<方法示例1>
图2示出根据本公开一实施例的Docker镜像生成方法的示例流程图。如图2所示,该方法包括步骤S2001-S2010。
S2001,获取当前代码提交事件,并对其进行解析得到当前分支代码信息。其中,分支代码信息中包括分支代码所属的代码工程的存储地址、代码工程的名称、分支代码以及目标镜像名称。
S2002,根据目标镜像名称判断,本次构建的目标Docker镜像是否被锁住,在判断目标镜像未被锁住的情况下,执行步骤S2003。在判断目标镜像已被锁住的情况下,延迟30s后,继续执行步骤S2002。
S2003,为目标镜像添加排它锁。
S2004,基于当前分支代码信息获取当前分支代码和当前分支代码对应的Nginx配置文件,并对当前分支代码进行工程编译,得到该当前分支代码的构建产物,并将编译得到的构建产物存储至本地的dist目录中。
S2005,将当前dist目录中的构建产物按照预设的目录结构上传至FTP服务器中,得到当前构建产物结合,并将对应的Nginx配置文件也上传至FTP服务器中。
S2006,由FTP服务器中下载当前构建产物结合以及当前已处理的各分支代码对应的Nginx配置文件。
S2007,基于DockerFile文件,将基础镜像、已处理的分支代码的配置文件以及当前构建产物集合中所存储的所有构建产物合生成代码工程的当前目标镜像。
S2008,将当前目标镜像推送至镜像仓库。
S2009,释放排它锁。
S2010,将镜像仓库中的当前目标镜像进行发布。
重复上述步骤,直到将所有分支代码构建至目标镜像中,此时,便完成了将系统的多个代码工程的多个分支代码构建至同一目标镜像中操作。
此处需要说明的是,当代码工程中的所有分支代发均完成上述步骤后,最后得到的当前目标镜像即为该代码工程最终对应的目标镜像,也就是说,在本公开中是通过依次更新目标镜像的方式生成最终的目标镜像的。
<方法示例2>
本实施例提供了另外一种Docker镜像的生成方法,该方法包括步骤:
第一,获取当前代码提交事件,并对其进行解析得到当前分支代码信息。其中,分支代码信息中包括分支代码所属的代码工程的存储地址、代码工程的名称、分支代码以及目标镜像名称。
第二,根据目标镜像名称判断,本次构建的目标Docker镜像是否被锁住,在判断目标镜像未被锁住的情况下,执行步骤S2003。在判断目标镜像已被锁住的情况下,延迟30s后,继续执行步骤二。
第三,为目标镜像添加排它锁。
第四,基于当前分支代码信息获取当前分支代码和当前分支代码对应的Nginx配置文件,并对当前分支代码进行工程编译,得到该当前分支代码的构建产物,并将编译得到的构建产物存储至本地的dist目录中。
第五,将当前dist目录中的构建产物按照预设的目录结构上传至FTP服务器中,得到当前构建产物结合,并将对应的Nginx配置文件也上传至FTP服务器中。
第六,释放排它锁。
第七,并重复上述步骤一至六,直到将系统中各分支代码构建产物以及对应的Nginx配置文件也上传至FTP服务器中。
第八,由FTP服务器中下载构建产物结合以及各分支代码对应的Nginx配置文件。
第九,基于DockerFile文件、拉取的基础镜像、下载构建产物结合以及各分支代码对应的Nginx配置文件生成系统的目标镜像。
第十,将目标镜像推送至镜像仓库,并将镜像仓库中的目标镜像进行发布。
<装置实施例>
图3示出根据本公开一实施例Docker镜像生成装置的示意性框图。如图3所示,Docker镜像生成装置100包括:
分支代码获取模块110,用于获取至少一个代码工程的至少两个分支代码;
构建产物集合构建模块120,用于对各所述分支代码进行工程编译,得到各所述分支代码的构建产物,并将各所述构建产物按照预设的目录结构进行存储,得到构建产物集合;
目标镜像生成模块130,用于基于所述构建产物集合,生成所述代码工程的目标镜像。
<设备实施例>
图4示出根据本公开一实施例Docker镜像生成设备的示意性框图。如图4所示,Docker镜像生成设备200包括:处理器210以及用于存储处理器210可执行指令的存储器220。其中,处理器210被配置为执行可执行指令时实现前面任一的Docker镜像生成方法。
此处,应当指出的是,处理器210的个数可以为一个或多个。同时,在本公开实施例的Docker镜像生成设备200中,还可以包括输入装置230和输出装置240。其中,处理器210、存储器220、输入装置230和输出装置240之间可以通过总线连接,也可以通过其他方式连接,此处不进行具体限定。
存储器220作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序和各种模块,如:本公开实施例的Docker镜像生成方法所对应的程序或模块。处理器210通过运行存储在存储器220中的软件程序或模块,从而执行Docker镜像生成设备200的各种功能应用及数据处理。
输入装置230可用于接收输入的数字或信号。其中,信号可以为产生与设备/终端/服务器的用户设置以及功能控制有关的键信号。输出装置240可以包括显示屏等显示设备。
<存储介质实施例>
根据本公开的第四方面,还提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,其特征在于,计算机程序指令被处理器执行时实现方式实施例中的任一所述方法。
以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
Claims (9)
1.一种Docker镜像生成方法,其特征在于,包括:
获取至少一个代码工程的至少两个分支代码;
遍历各所述分支代码;
针对遍历的当前分支代码进行工程编译,得到所述当前分支代码的构建产物,并将所述构建产物按照预设的目录结构上传至FTP服务器中进行存储;
遍历结束,在所述FTP服务器上得到由各所述分支代码的构建产物组成的构建产物集合;
由FTP服务器中下载所述构建产物集合,并基于所述构建产物集合,生成所述代码工程的目标镜像;
其中,预设的所述目录结构为代码工程名称/分支代码名称/构建产物。
2.根据权利要求1所述的方法,其特征在于,在获取代码工程的所述分支代码时,包括:
获取所述分支代码的分支代码信息,并基于所述分支代码信息获取所述分支代码,其中,所述分支代码信息包括所述分支代码所属的代码工程的存储地址和名称以及所述分支代码的名称。
3.根据权利要求1所述的方法,其特征在于,在获取所述分支代码的分支代码前,还包括:判断所述分支代码对应的目标镜像是否被锁住,在判断所述目标镜像未被锁住的情况下,为所述目标镜像添加排它锁的步骤。
4.根据权利要求1所述的方法,其特征在于,基于所述构建产物集合,生成所述代码工程的目标镜像时,包括:
获取基础镜像、已处理的所述分支代码的配置文件、以及当前构建产物集合中所存储的所有构建产物;
基于所述基础镜像、已处理的所述分支代码的配置文件以及当前构建产物集合中所存储的所有构建产物生成所述代码工程的目标镜像。
5.根据权利要求3所述的方法,其特征在于,在生成所述代码工程的目标镜像后,还包括:释放所述排它锁。
6.根据权利要求1所述的方法,其特征在于,在生成所述代码工程的目标镜像后,还包括:将所述目标镜像推送至预设的镜像仓库。
7.一种Docker镜像生成装置,其特征在于,包括:
分支代码获取模块,用于获取至少一个代码工程的至少两个分支代码;
构建产物集合构建模块,用于遍历各所述分支代码;针对遍历的当前分支代码进行工程编译,得到所述当前分支代码的构建产物,并将所述构建产物按照预设的目录结构上传至FTP服务器中进行存储;遍历结束,在所述FTP服务器上得到由各所述分支代码的构建产物组成的构建产物集合;
目标镜像生成模块,用于由FTP服务器中下载所述构建产物集合,并基于所述构建产物集合,生成所述代码工程的目标镜像;
其中,预设的所述目录结构为代码工程名称/分支代码名称/构建产物。
8.一种Docker镜像生成设备,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述可执行指令时实现权利要求1至6中任意一项所述的方法。
9.一种非易失性计算机可读存储介质,其上存储有计算机程序指令,其特征在于,所述计算机程序指令被处理器执行时实现权利要求1至6中任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310544588.6A CN116301950B (zh) | 2023-05-15 | 2023-05-15 | Docker镜像生成方法、装置、设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310544588.6A CN116301950B (zh) | 2023-05-15 | 2023-05-15 | Docker镜像生成方法、装置、设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116301950A CN116301950A (zh) | 2023-06-23 |
CN116301950B true CN116301950B (zh) | 2023-08-01 |
Family
ID=86803469
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310544588.6A Active CN116301950B (zh) | 2023-05-15 | 2023-05-15 | Docker镜像生成方法、装置、设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116301950B (zh) |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9542414B1 (en) * | 2013-01-11 | 2017-01-10 | Netapp, Inc. | Lock state reconstruction for non-disruptive persistent operation |
CN109408033B (zh) * | 2017-09-04 | 2022-05-24 | 郑州云海信息技术有限公司 | 一种基于jenkins的镜像文件构建方法及装置 |
CN107766126B (zh) * | 2017-11-15 | 2023-01-13 | 腾讯科技(深圳)有限公司 | 容器镜像的构建方法、系统、装置及存储介质 |
CN108897527B (zh) * | 2018-05-21 | 2022-04-15 | 东莞理工学院 | 一种云计算中遥感图像处理的Docker镜像自动化动态构建方法 |
CN110569044B (zh) * | 2019-09-09 | 2022-07-12 | 浪潮通用软件有限公司 | 一种将应用部署到运行环境的方法、装置及系统 |
CN113127136B (zh) * | 2019-12-30 | 2023-12-12 | 北京懿医云科技有限公司 | Docker镜像生成方法及装置、存储介质、电子设备 |
CN111367869A (zh) * | 2020-02-26 | 2020-07-03 | 北京三快在线科技有限公司 | 镜像文件处理方法、装置、存储介质及电子设备 |
CN112835594A (zh) * | 2021-01-15 | 2021-05-25 | 深圳行云创新科技有限公司 | 基于Kubernetes的镜像构建方法及其构建系统 |
CN113821228B (zh) * | 2021-09-30 | 2023-07-11 | 奥特酷智能科技(南京)有限公司 | 一种基于分层容器镜像构建ros或类ros项目的方法 |
CN115202729A (zh) * | 2022-07-30 | 2022-10-18 | 重庆长安汽车股份有限公司 | 基于容器服务的镜像生成方法、装置、设备及介质 |
CN115562690B (zh) * | 2022-12-05 | 2023-04-18 | 杭州未名信科科技有限公司 | 基于Docker容器的算法服务处理方法、装置及介质 |
CN115794139B (zh) * | 2023-01-16 | 2023-04-28 | 腾讯科技(深圳)有限公司 | 镜像数据处理方法、装置、设备以及介质 |
-
2023
- 2023-05-15 CN CN202310544588.6A patent/CN116301950B/zh active Active
Non-Patent Citations (2)
Title |
---|
Assessing and Improving the Quality of Docker Artifacts;Giovanni Rosa et al.;《 IEEE Xplore》;全文 * |
面向Dockerfile的容器镜像构建工具;耿朋;陈伟;魏峻;;计算机系统应用(第11期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN116301950A (zh) | 2023-06-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107609004B (zh) | 应用程序埋点方法和装置、计算机设备和存储介质 | |
EP3912075A1 (en) | Generating synchronous digital circuits from source code constructs that map to circuit implementations | |
US11328021B2 (en) | Automatic resource management for build systems | |
CN115576677A (zh) | 批量遥感数据快速处理的任务流程调度管理系统及方法 | |
CN112149035A (zh) | 网站静态资源处理方法及装置 | |
CN115658496A (zh) | 可扩展的Web自动化测试方法、系统、设备及存储介质 | |
CN116069341A (zh) | 一种应用程序的自动化部署方法、设备及存储介质 | |
CN116257438A (zh) | 接口测试用例的更新方法及相关设备 | |
CN116301950B (zh) | Docker镜像生成方法、装置、设备和存储介质 | |
CN108427580B (zh) | 配置对命名重复的检测方法、存储介质和智能设备 | |
CN112711419A (zh) | 一种数据比对方法及装置 | |
CN114756261B (zh) | 一种容器集群的升级方法、系统、电子设备及介质 | |
CN115396159A (zh) | 一种容器镜像的检测方法及客户端、服务端 | |
CN115617555A (zh) | 一种信息处理系统以及方法 | |
CN114816816A (zh) | 崩溃堆栈信息处理方法、装置、设备及存储介质 | |
CN111400243A (zh) | 基于流水线服务的研发管理系统以及文件存储方法、装置 | |
CN113806327A (zh) | 一种数据库设计方法、装置及相关设备 | |
CN112783903A (zh) | 生成更新日志的方法和装置 | |
US11770299B2 (en) | Systems and methods for preprocessing automated network device configuration generation templates | |
US20240037017A1 (en) | Verification of core file debugging resources | |
CN117234492A (zh) | 一种游戏通用模块的高效开发方法、系统、设备及介质 | |
CN117950809A (zh) | 云渲染方法、装置、电子设备、存储介质和程序产品 | |
Mwebaze et al. | A data lineage model for distributed sub-image processing | |
CN115114164A (zh) | 测试方法、装置、电子设备及存储介质 | |
CN117519814A (zh) | 一种共享方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |