用于定制本地构建环境镜像的方法和系统与流程

未命名 10-08 阅读:90 评论:0


1.本公开涉及软件开发环境,特别是涉及容器化软件开发环境。


背景技术:

2.通常,软件的开发和编译需要安装一堆工具和实用程序。这些工具和实用程序通常是特定于平台、版本和架构的。创建这样的环境需要大量的手动设置,以及监控和应用可用的更新,浪费了开发人员的精力。
3.简化开发环境的一个选择是使用容器化的解决方案。具体地,容器可以被认为是软件单元,它将代码和依赖关系打包,以便应用程序可以从一个计算环境快速可靠地运行到另一计算环境。容器在容器引擎上运行,并且可以包括由加州旧金山的docker公司提供的容器引擎、华盛顿州雷德蒙德的微软公司提供的windows server容器、linux容器或lxc,以及其他选项。
4.然而,即使有这样的容器化环境,在容器中开发的源代码需要被复制到容器中、进行构建、并且然后将构建制品(“artifact”)复制回宿主机。附加地,编译所需的任何许可也必须被复制到这样的容器中。
附图说明
5.参考附图将更好地理解本公开,其中:
6.图1是示出了能够与本公开的实施例一起使用的示例计算系统的框图。
7.图2是示出了在独立于操作系统的容器引擎上运行的容器的框图。
8.图3是示出了手动创建容器化开发环境的过程的数据流图。
9.图4是示出了通过创建定制的本地镜像来创建容器化开发的过程的数据流图。
10.图5是示出了从开发人员的角度创建容器化开发的过程的数据流图。
11.图6是能够与本公开的实施例一起使用的简化的计算设备的框图。
具体实施方式
12.本公开提供了一种在计算设备处的方法,包括:从主机计算设备获得第一容器镜像;在计算设备处执行第二容器镜像,该执行包括:从第一容器镜像启动容器,该容器用于计算设备上的开发环境;以及定制针对计算设备上的本地环境的容器,从而创建定制容器;以及在定制容器内编译已开发的代码。
13.本公开还提供了一种计算设备,包括:处理器;以及通信子系统,其中计算设备被配置为:从主机计算设备获得第一容器镜像;在计算设备处执行第二容器镜像,该执行包括:从第一容器镜像启动容器,该容器用于计算设备上的开发环境;以及定制针对计算设备上的本地环境的容器,从而创建定制容器;以及在定制容器内编译已开发的代码。
14.本公开还提供了一种计算机可读介质,用于存储指令代码,当由处理器在计算设备上执行时,该指令代码使计算设备:从主机计算设备获得第一容器镜像;在计算设备处执
行第二容器镜像,该执行包括:从第一容器镜像启动容器,该容器用于计算设备上的开发环境;以及定制针对计算设备上的本地环境的容器,从而创建定制容器;以及在定制容器内编译已开发的代码。
15.根据本公开的实施例,定制的本地构建环境镜像克服了处理设立本地开发环境或在容器内提供开发环境的问题。定制本地构建环境镜像使用标准基础镜像,该标准基础镜像也可以用于持续集成/持续分发(cl/cd)构建中,以生成针对特定用户和主机定制的新镜像。
16.定制本地构建环境镜像提供项目源代码,以及项目所需的所有许可和配置文件,作为容器内的挂载,以允许使用双向信息流直接访问。
17.编译过程直接从本地目录读取数据,并且将输出直接写入该目录。附加地,定制的本地构建环境在容器内复制本地用户和组,以允许使用相同的用户和组标识符进行读/写访问。
18.定制本地构建环境镜像是利用生成定制镜像并且启动容器的构建过程来实现的。
19.容器化系统示例
20.将描述关于使用docker镜像和容器的docker系统的本公开。然而,这仅仅是为了说明目的而提供的,并且本文描述的方法和系统可以同样地与任何其他容器化系统一起使用。
21.例如,现在参考图1,图1示出了开发人员计算设备110,该设备可以是开发人员用于创建、测试和构建软件的任何计算设备。如下文所描述的,由于容器开发的性质,操作系统和计算设备110的类型可以在开发人员之间变化而不影响开发环境。
22.开发人员计算设备110可以利用诸如互联网120的网络与主机或企业服务器130进行通信,其中这样的服务器可以包含用于存储正在开发的代码的存储库和标准容器镜像,以及其他信息。网络或互联网120可以是能够允许在计算设备110和主机或服务器130之间进行通信的任何网络,并且可以包括局域网、广域网等。网络或互联网120与计算设备110之间的通信可以利用任何有线或无线通信技术。类似地,主机或服务器130与网络或互联网120之间的通信可以使用任何有线或无线通信技术。
23.由于在本地计算设备110上使用容器,因此可以在这样的计算设备上安装容器引擎。现在参考图2,图2示出了用于在计算设备上使用容器的结构的示例。
24.特别是,在图2的实施例中,用于计算设备的基础设施在层210处示出。主机操作系统212运行在这样的基础设施层210的顶层上。
25.为了允许容器运行并且独立于主机操作系统212,容器引擎214作为容器与主机操作系统212之间的抽象层。
26.在图2的示例中,示出了多个容器化的应用程序在容器引擎214的顶层运行。特别是,在图2的示例中,示出了5个容器化应用程序,即应用程序220、222、224、226和228。图2中提供的应用程序的数目和类型仅作为示例提供,根据用户的需求,以及基础设施210支持这种数目的容器的能力,任何数目的容器化应用程序都可以使用容器引擎214运行。
27.创建容器开发环境
28.如上文所述,容器环境提供了将开发环境的包作为镜像并且在容器内构建软件的可能性。然而,这仍然需要相当多的手动设置和编译后的手动步骤。
29.现在参考图3,图3示出了在传统开发环境中使用容器的示例。特别是,在图3的实施例中,主机310可以包含用于正在开发的软件项目的存储库。计算设备312可以是本地开发人员的计算设备。容器314可以是正在其中开发代码的容器。
30.希望从主机310开发代码的开发人员可以请求如在消息320处所示的镜像,并且可以接收如在消息322处所示的镜像。
31.基于在消息322处接收到的镜像,开发人员计算设备320可以启动如在消息330处所示的容器。
32.此后,如在箭头332处所示,开发人员必须将源代码手动复制到容器中。
33.进一步地,如在箭头334处所示,开发人员必须将任何所需的许可手动复制到容器314中。
34.进一步地,如在箭头336处所示,开发人员必须将开发环境所需的任何其他制品手动复制到容器314中。
35.只有在源代码、许可和制品被复制到容器314之后,容器314才能被用来编译代码,如框340所示的示例。
36.一旦代码被编译,开发人员就必须将容器314中的任何构建制品手动复制到计算设备312中,如在箭头350处所示。
37.只有这样,开发人员才能停止容器,如在箭头352处所示。
38.执行在箭头332、334、336和350处的所有手动复制的要求需要开发人员花费大量的时间和精力。
39.定制本地构建环境镜像
40.根据本公开的各种实施例,可以利用本地开发环境镜像将标准基础镜像转换为本地开发环境。
41.特别是,现在参照图4。在图4的实施例中,主机410可以包括用于开发环境的标准基础镜像。
42.开发人员计算设备412可以与主机410通信,并且可以进一步启动如下文所描述的开发环境容器414。
43.与图3的实施例一样,在图4的实施例中,开发人员计算设备412向主机410请求镜像,如在消息420处所示。作为响应,用于开发的基础镜像作为消息422返回。
44.随后,开发人员计算设备412可以启动本地构建环境,如框430所示。进一步地,随后可以在框432处创建用于开发人员计算设备412的定制镜像。下文提供了启动和构建定制镜像的示例。
45.一旦定制镜像被创建,容器可以被自动启动,如箭头440所示,利用定制镜像创建容器。
46.还可以基于定制镜像来自动映射源代码,如箭头442所示。
47.进一步地,所需的许可可以基于在框432处构建的定制镜像而被自动映射,如箭头444所示。
48.进一步地,其他制品可以基于在框432处的定制镜像而被自动映射,如箭头446所示。
49.这样,容器414就具有为开发人员创建本地开发环境所需的所有源代码、许可和制
品,而无需开发人员手动配置和创建这样的环境,从而节省了开发人员资源。
50.一旦容器被配置,并且代码已经被开发出来,那么它可以在框450处被编译。容器可以自动生成在开发人员计算设备412处所需要的构建制品,并且在消息460中提供这些制品。
51.然后可以退出本地构建环境,如在框462处所示。
52.从开发人员的角度来看,现在可以参考图5。特别是,在图5的实施例中,使用开发人员计算设备512的开发人员可以从主机510请求镜像,如消息520所示。该镜像在消息522中返回。
53.然后开发人员可以启动本地构建环境,如箭头530所示,自动创建容器514。开发人员随后可以在框540处编译代码,并且在框550处退出本地构建环境。
54.因此,从开发人员的角度来看,图5的实施例提供了比图3的实施例简单得多的提供开发环境的方法。
55.下文提供了一个利用docker创建本地构建镜像来编译代码的示例。这个示例是简化的,并且仅为说明的目的而提供。
56.在示例中,需要编译的代码可以包括用c语言编写的“hello world”程序,例如下文的表1所示。
[0057][0058]
表1:需要编译的示例代码
[0059]
例如,如图4和图5中所示,可以从主机获得的标准镜像,在本示例中可以是名为“dockerfile”的文件。下面文的表2示出了dockerfile的一个示例。
[0060][0061]
表2:示例标准镜像
[0062]
表2中的dockerfile用于构建cl/cd中使用的镜像,并且dockerfile包含使用“builder”,并且在目录“/builds/workspace”中启动,其中构建器(builder)用户可以克隆存储库并且编译代码。
[0063]
第三个文件可以是本地构建环境的部分,在本示例中称为“dockerfile.local”。该文件提供了本地构建环境的定义,它们可以用于编译在开发人员机器(诸如,开发人员计算设备412或开发人员计算设备512)上本地执行的容器中的代码。下文的表3中提供了这样的文件的示例。
[0064]
[0065][0066]
表三:示例定制本地镜像
[0067]
从上文的表3中,本地构建环境可以用来编译在开发人员机器上本地执行的容器中的代码,在镜像中复制的本地用户名、标识符、组名和组标识符。
[0068]
第四个可以用来创建本地构建环境的文件是配置文件(在本示例中,配置文件是yaml文件),本文称为“docker-compose.local.yml”。这是组成定义,其可以用于运行带有所有传入参数的本地构建环境,并且将所有相关的本地文件和目录挂载到容器中。下文的表4提供了这样的文件的示例。
[0069][0070]
表4:示例本地组成文件
[0071]
进一步地,可以在“makefile”中提供构建指令,其示例如下文的表5所示。
[0072][0073][0074]
表5:示例makefile
[0075]
在上文的示例代码中,makefile特别地要求使用alpine linux编译c代码。如果在
另一台主机上使用“make”命令编译代码,则会显示
[0076]
表6中的以下错误。
[0077][0078]
表6:在非许可的主机上尝试编译的示例
[0079]
表6表明,除非使用alpine linux主机,否则无法构建该代码。
[0080]
反过来说,一旦获得了基础镜像,就可以在开发人员的计算设备上创建本地构建环境。例如,下文的表7示出了使用“make local_environment”命令创建本地构建环境的过程。上文的表5中的makefile的各个步骤可能会产生以下执行数据。
[0081]
[0082]
[0083]
[0084]
[0085][0086]
表7:从本地环境构建的示例输出
[0087]
从表7中可以看到,首先构建了开发容器。在表7的示例中,这涉及到7个步骤,包括添加目录和用户。
[0088]
接下来,从表7中使用上文的表4的“docker-compose.local.yml”文件组合本地镜像。这涉及表7示例中的13个步骤,包括定义本地用户、组和环境。
[0089]
在表7的末尾,运行环境位于本地、定制构建的docker镜像中。
[0090]
从这一点开始,代码就可以被编译了,如下文的表8提供的示例。
[0091][0092]
表8:在容器中编译代码的示例
[0093]
表8中,表1的hello.c文件被成功编译。然后可以退出docker程序,并且编译后程序的二进制文件将存在于本地机器上的当前目录中。然而,由于二进制文件在容器之外,它可能无法在某些计算设备操作系统上执行。
[0094]
基于上文,通过应用配置了本地参数的开发镜像,可以从标准镜像创建定制的本地开发环境。
[0095]
上述计算设备、服务器、网络节点或计算机可以使用任何计算设备来实现。关于图6,示出了计算设备的一个简化示图。图6的计算设备可以是任何固定的或移动的计算设备。
[0096]
在图6中,设备610包括处理器620和通信子系统630,其中处理器620和通信子系统630协同执行上文所描述的实施例的方法。通信子系统630允许设备610与其他设备或网络元素进行通信,并且可以基于所执行的通信类型而变化。进一步地,通信子系统630可以包括多种通信技术,包括任何有线或无线通信技术。
[0097]
处理器620被配置为执行可编程逻辑,该逻辑可以与数据一起存储在设备610上,并在图6的示例中显示为存储器632。存储器632可以是任何有形的、非暂态的计算机可读存储介质,其存储指令代码,当处理器620执行该指令代码时,该指令代码使设备610执行本公开的方法。计算机可读存储介质可以是有形的或暂态的/非暂态的介质,诸如光学(例如,cd、dvd等)、磁性(例如,磁带)、闪存驱动器、硬盘驱动器或本领域已知的其他存储器。
[0098]
备选地,或者除了存储器632之外,设备610可以访问来自外部存储介质的数据或可编程逻辑,例如通过通信子系统630。
[0099]
在一个实施例中,设备610的各个元素之间的通信可以通过内部总线660。然而,其它形式的通信也是可能的。
[0100]
本文描述的实施例是具有与本技术的技术的元素相对应的元素的结构、系统或方法的示例。这一书面描述可以使本领域技术人员能够制造和使用具有同样对应于本技术技术的要素的替代要素的实施例。因此,本技术的技术的预期范围包括与本文所描述的本技术的技术没有区别的其他结构、系统或方法,并且进一步包括与本文所描述的本技术的技术没有实质性区别的其他结构、系统或方法。
[0101]
虽然在附图中以特定顺序描述操作,但这不应理解为要求按照所示的特定顺序或依序执行此类操作,或者要求执行所图示的所有操作,以获得期望的结果。在某些情况下,可以采用多任务处理和并行处理。此外,不应将上文描述的实现中各种系统组件的分离理解为在所有实现中都需要这样的分离,而应理解所描述的程序组件和系统一般可以集成在一个软件产品中或打包成多个软件产品。
[0102]
此外,在各种实施例中作为离散的或分离的描述和说明的技术、系统、子系统和方法可以与其他系统、模块、技术或方法组合或集成。作为耦合或直接耦合或相互通信所示出或讨论的其他项目可以间接耦合或通过某些接口、设备或中间组件进行通信,无论是电气的、机械的还是其他方式。变化、替换和修改的其他示例可以由本领域技术人员确定并且可以作出。
[0103]
虽然上述详细描述已经示出、描述并且指出了应用于各种实现的本公开的基本新颖特征,但是应当理解的是,所示系统的形式和细节中的各种省略、替换和变化可以由本领域技术人员作出。此外,方法步骤的顺序并不通过它们在权利要求中出现的顺序来暗示。
[0104]
当向电子设备发送消息/从电子设备发送消息时,这种操作可以不是立即的,也可以不是直接从服务器发送的。它们可以从支持本文所描述的设备/方法/系统的服务器或其他计算系统基础设施同步或异步地递送。上述步骤可以全部或部分包括与设备/基础设施之间的同步/异步通信。此外,来自电子设备的通信可以是到达网络上的一个或多个端点。这些端点可以由服务器、分布式计算系统、流处理器等提供服务。内容递送网络(cdn)也可以向电子设备提供通信。例如,与典型的服务器响应不同,服务器还可以提供或指示用于内容递送网络(cdn)的数据,以便稍后等待电子设备下载,诸如电子设备的后续活动。因此,数据可以直接从服务器或其他基础设施(诸如分布式基础设施或cdn)作为系统的部分或独立于系统发送。
[0105]
通常,存储介质可以包括以下任何项或某些组合:半导体存储设备诸如动态或静态随机存取存储器(dram或sram)、可擦除和可编程只读存储器(eprom)、电可擦除和可编程只读存储器(eeprom)和闪存;磁盘,诸如固定磁盘、软磁盘和可移动磁盘;另一磁性介质,包括磁带;光学介质,诸如光盘(cd)或数字视频光盘(dvd);或其他类型的存储设备。注意,上面讨论的指令可以提供在计算机可读或机器可读的存储介质上,或者备选地,可以提供在分布在可能具有多个节点的大型系统中的多个计算机可读或机器可读存储介质上。这种计算机可读或机器可读的存储介质或媒体被认为是物品(或制品)的部分。物品或者制品可以指任何制造出来的单个部件或者多个部件。存储介质或媒体可以位于运行机器可读指令的机器中,也可以位于远程站点,从该站点可以通过网络下载机器可读指令以执行。
[0106]
在上述描述中,提出了许多细节以提供对本文公开的主题的理解。然而,可以在没
有这些细节的情况下实施实现。其他实现可能包括对上文讨论的细节的修改和变化。所附权利要求书旨在涵盖这些修改和变型。

技术特征:
1.一种计算设备处的方法,包括:从主机计算设备获得第一容器镜像;在所述计算设备处执行第二容器镜像,所述执行包括:从所述第一容器镜像启动容器,所述容器用于所述计算设备上的开发环境;以及定制针对所述计算设备上的本地环境的所述容器,从而创建定制容器;以及在所述定制容器内编译已开发的代码。2.根据权利要求1所述的方法,其中定制所述容器包括:从所述主机将源代码自动导入所述容器中。3.根据权利要求1所述的方法,其中定制所述容器包括:在所述容器内复制本地用户和组标识符。4.根据权利要求1所述的方法,其中定制所述容器包括:将所述容器挂载在所述计算设备上的文件系统内,以允许从所述容器读取和写入的访问。5.根据权利要求4所述的方法,其中所述编译还包括:将编译制品自动写到所述计算设备上的所述文件系统。6.根据权利要求1所述的方法,其中定制所述容器包括:将用于所述开发环境的许可自动导入所述容器中。7.根据权利要求1所述的方法,其中定制所述容器包括:将用于所述开发环境的制品自动映射到所述容器内。8.根据权利要求1所述的方法,其中所述定制使用与所述第二容器镜像相关联的配置文件。9.根据权利要求8所述的方法,其中所述第一容器镜像和所述第二容器镜像是docker镜像,并且其中所述配置文件是yaml文件。10.一种计算设备,包括:处理器;以及通信子系统,其中所述计算设备被配置为:从主机计算设备获得第一容器镜像;在所述计算设备处执行第二容器镜像,所述执行包括:从所述第一容器镜像启动容器,所述容器用于所述计算设备上的开发环境;以及定制针对所述计算设备上的本地环境的所述容器,从而创建定制容器;以及在所述定制容器内编译已开发的代码。11.根据权利要求10所述的计算设备,其中所述计算设备被配置为:通过从所述主机将源代码自动导入所述容器来定制所述容器。12.根据权利要求10所述的计算设备,其中所述计算设备被配置为,通过在所述容器内复制本地用户和组标识符来定制所述容器。13.根据权利要求10所述的计算设备,其中所述计算设备被配置为,通过将所述容器挂载在所述计算设备上的文件系统内,以允许从所述容器读取和写入的访问,来定制所述容器。14.根据权利要求13所述的计算设备,其中所述计算设备被配置为,通过将编译制品自
动写到所述计算设备上的所述文件系统来进行编译。15.根据权利要求10所述的计算设备,其中所述计算设备被配置为,通过将用于所述开发环境的许可自动导入所述容器来定制所述容器。16.根据权利要求10所述的计算设备,其中所述计算设备被配置为,通过自动将用于所述开发环境的制品映射到所述容器内来定制所述容器。17.根据权利要求10所述的计算设备,其中所述计算设备被配置为,通过使用与所述第二容器镜像相关联的配置文件进行定制。18.根据权利要求17所述的计算设备,其中所述第一容器镜像和所述第二容器镜像是docker镜像,其中所述配置文件是yaml文件。19.一种计算机可读介质,用于存储指令代码,当由处理器在计算设备上执行时,所述指令代码使所述计算设备:从主机计算设备获得第一容器镜像;在所述计算设备处执行第二容器镜像,所述执行包括:从所述第一容器镜像启动容器,所述容器用于所述计算设备上的开发环境;以及定制针对所述计算设备上的本地环境的所述容器,从而创建定制容器;以及在所述定制容器内编译已开发的代码。

技术总结
一种在计算设备上的方法,包括从主机计算设备获得第一容器镜像;在计算设备上执行第二容器镜像,该执行包括:从第一容器镜像启动容器,该容器用于计算设备上的开发环境;并且定制针对计算设备上的本地环境的容器,从而创建定制容器;并且在定制容器内编译已开发的代码。码。码。


技术研发人员:K
受保护的技术使用者:黑莓有限公司
技术研发日:2022.03.21
技术公布日:2023/10/5
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐