掌桥专利:专业的专利平台
掌桥专利
首页

一种基于容器的编译方法、装置、设备及介质

文献发布时间:2023-06-19 15:47:50



技术领域

本发明涉及计算机技术领域,特别涉及一种基于容器的编译方法、装置、设备及介质。

背景技术

高性能软件在部署和管理过程中面临依赖环境复杂、软件移植性差以及权限使用不灵活的问题。目前软件的部署主要通过源码编译安装或者通过各种软件管理工具安装。源码编译安装需要考虑复杂的依赖环境,安装后需手动来对软件环境变量进行管理。很多软件管理工具都可以起到对软件依赖环境的管理作用,并且使用时无需管理员权限,如Conda,Spack等部署工具,但这类管理工具无法囊括所有的软件,且通过这些工具部署软件失败时,调试起来非常复杂。容器技术共享系统内核,通过容器引擎将软件及所有的依赖进行打包,解决了复杂依赖环境的管理问题;打包后的容器镜像可利用容器引擎直接移植到不同的Linux上直接运行,解决了软件部署时的移植问题;容器技术提供类似于虚拟机的操作环境,管理员及用户可以在计算平台或者本地灵活地使用管理员权限,且不会对原有系统造成影响,解决了软件部署时需要考虑的权限问题。

基于Docker Swarm的MPI并行软件部署使用复杂,性能损耗大,不适合在高性能计算场景中使用;Shifter容器专门用于高性能计算,但需要专门的镜像网关,部署后的软件镜像为只读,不利于修改,使用不够灵活;Singularity容器克服了Docker容器不方便运行大规模并行计算的挑战。其完全基于可移植性进行虚拟化,更加轻量级,部署更快,使用时只需在节点上安装Singularity即可。其主要技术方案是:(1)安装Singularity容器;(2)制作Singularity基础镜像;(3)制作应用镜像。在现有的技术方案中,制作应用镜像时一般是使用与所需要打包的基础镜像完全一致的完全物理系统,并在其内编译所需要使用的应用,然后将其拷入所需制作的基础镜像中,最后配置相应的库环境即可,如此一来必须要提前编译好可执行文件,对于某些应用,如CESM(Community Earth System Model,社区地球系统模式),生成的可执行文件是和编译参数绑定的,例如进程数,如需要进行大规模的扩展,更换进程数后需要重复多次编译。然而制作容器的过程,对非专业的人员是一个比较大的挑战,也改变了使用容器部署软件的初衷。

为此,如何避免现有技术中每更改一次编译参数就对应生成一个容器、节省资源以及减少工作量是本领域亟待解决的问题。

发明内容

有鉴于此,本发明的目的在于提供一种基于容器的编译方法、装置、设备及介质,能够避免现有技术中每更改一次编译参数就对应生成一个容器的问题,并且节省资源和减少工作量,其具体方案如下:

第一方面,本申请公开了一种基于容器的编译方法,包括:

在基础镜像内安装与目标应用软件对应的系统依赖库;

基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,并根据所述基础镜像和所述脚本文件构建与所述目标应用软件对应的容器;

获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件;

通过执行所述目标配置文件,调用所述脚本文件以实现在所述容器内对所述目标应用软件的源代码进行编译。

可选的,所述在基础镜像内安装与目标应用软件对应的系统依赖库,包括:

判断基础镜像内是否已安装与目标应用软件对应的系统依赖库;

如果所述基础镜像内未安装与所述目标应用软件对应的系统依赖库,则在所述基础镜像内安装与所述目标应用软件对应的系统依赖库。

可选的,所述在基础镜像内安装与目标应用软件对应的系统依赖库,包括:

在所述基础镜像内安装与社区地球系统模式对应的系统依赖库。

可选的,所述在所述基础镜像内安装与社区地球系统模式对应的系统依赖库之前,还包括:

确定与所述社区地球系统模式对应的netcdf依赖库。

可选的,所述根据所述基础镜像和所述脚本文件构建与所述目标应用软件对应的容器,包括:

根据与所述netcdf依赖库对应的依赖库脚本文件、所述基础镜像以及所述目标应用软件的脚本文件构建与所述目标应用软件对应的容器。

可选的,所述获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件,包括:

基于预先创建的算例获取自定义编译参数,并将所述自定义线程数添加至配置文件中,以生成目标配置文件。

可选的,所述获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件之前,还包括:

判断是否存在编译命令;

如果不存在所述编译命令,则设置与所述编译命令相关的环境变量,以生成所述编译命令;

相应的,所述获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件,包括:

利用所述编译命令对添加所述自定义编译参数后的所述配置文件进行编译,以生成所述目标配置文件。

第二方面,本申请公开了一种基于容器的编译装置,包括:

系统依赖库安装模块,用于在基础镜像内安装与目标应用软件对应的系统依赖库;

容器构建模块,用于基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,并根据所述基础镜像和所述脚本文件构建与所述目标应用软件对应的容器;

目标配置文件生成模块,用于获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件;

编译模块,用于通过执行所述目标配置文件,调用所述脚本文件以实现在所述容器内对所述目标应用软件的源代码进行编译。

第三方面,本申请公开了一种电子设备,包括:

存储器,用于保存计算机程序;

处理器,用于执行所述计算机程序,以实现前述公开的基于容器的编译方法。

第四方面,本申请公开了一种计算机可读存储介质,用于保存计算机程序;其中,所述计算机程序被处理器执行时实现前述公开的基于容器的编译方法。

可见,本申请提出一种基于容器的编译方法,包括:在基础镜像内安装与目标应用软件对应的系统依赖库;基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,并根据所述基础镜像和所述脚本文件构建与所述目标应用软件对应的容器;获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件;通过执行所述目标配置文件,调用所述脚本文件以实现在所述容器内对所述目标应用软件的源代码进行编译。可见,相较于传统的每更改一次编译参数就对应生成一个容器的方法,本申请首先生成了一个容器,然后基于编译参数在容器外部生成了目标配置文件,如此一来,只需根据编译参数的修改需求修改配置文件,而无需每次在修改编译参数时生成不同的容器,由此节省了资源,减少了工作量。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本申请公开的一种基于容器的编译方法流程图;

图2为本申请公开的一种具体的基于容器的编译方法流程图;

图3为本申请公开的一种整体框架结构子示意图;

图4为本申请公开的一种整体框架结构子示意图;

图5为本申请公开的一种源码及输入数据模块结构示意图;

图6为本申请公开的一种编译器模块结构示意图;

图7为本申请公开的一种依赖库安装模块结构示意图;

图8为本申请公开的一种算例模块结构示意图;

图9为本申请公开的一种基于容器的编译装置结构示意图;

图10为本申请公开的一种电子设备结构图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

对于某些应用,如CESM,生成的可执行文件是和编译参数绑定的,例如进程数,如需要进行大规模的扩展,更换进程数后需要重复多次编译。然而制作容器的过程,对非专业的人员是一个比较大的挑战,也改变了使用容器部署软件的初衷。

为此,本申请实施例提出一种基于容器的编译方案,能够只需根据编译参数的修改需求修改配置文件,而无需每次在修改编译参数时生成不同的容器,由此节省了资源,减少了工作量。

本申请实施例公开了一种基于容器的编译方法,参见图1所示,该方法包括:

步骤S11:在基础镜像内安装与目标应用软件对应的系统依赖库。

本实施例中,首先判断基础镜像内是否已安装与目标应用软件对应的系统依赖库;如果所述基础镜像内未安装与所述目标应用软件对应的系统依赖库,则在所述基础镜像内安装与所述目标应用软件对应的系统依赖库。

步骤S12:基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,并根据所述基础镜像和所述脚本文件构建与所述目标应用软件对应的容器。

需要指出的是,容器技术提供类似于虚拟机的环境将软件以容器的方式进行隔离,使软件的安装和管理变得简单。容器技术是一种以应用软件为中心的虚拟化技术,以应用软件为单元,将软件及所有的依赖打包成容器,打包后的容器可直接移植到不同的Linux上运行。容器技术提供类似于虚拟机的隔离环境,不同的容器共享操作系统的内核,相互隔离,没有接口,各自在自己的隔离环境中运行,不存在冲突。

本实施例中,基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,并根据所述基础镜像和所述脚本文件构建与所述目标应用软件对应的容器,如此一来,可以使所述目标应用软件的安装和管理变的简单。

步骤S13:获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件。

本实施例中,首先判断是否存在编译命令;如果不存在所述编译命令,则设置与所述编译命令相关的环境变量,以生成所述编译命令;相应的,所述获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件,包括:利用所述编译命令对添加所述自定义编译参数后的所述配置文件进行编译,以生成所述目标配置文件。需要指出的是,所述自定义编译参数包括但不限于进程数、线程数以及分辨率。

本实施例中,较于传统的每更改一次编译参数就对应生成一个容器的方法,本申请首先生成了一个容器,然后基于编译参数在容器外部生成了目标配置文件。如此一来,只需根据编译参数的修改需求修改配置文件,而无需每次在修改编译参数时生成不同的容器,由此节省了资源,减少了工作量。

步骤S14:通过执行所述目标配置文件,调用所述脚本文件以实现在所述容器内对所述目标应用软件的源代码进行编译。

本实施例中,通过执行所述目标配置文件,可以调用所述目标应用软件脚本文件,以实现在所述容器内对所述目标应用软件的源代码进行编译。

可见,本申请提出一种基于容器的编译方法,包括:在基础镜像内安装与目标应用软件对应的系统依赖库;基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,并根据所述基础镜像和所述脚本文件构建与所述目标应用软件对应的容器;获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件;通过执行所述目标配置文件,调用所述脚本文件以实现在所述容器内对所述目标应用软件的源代码进行编译。可见,相较于传统的每更改一次编译参数就对应生成一个容器的方法,本申请首先生成了一个容器,然后基于编译参数在容器外部生成了目标配置文件,如此一来,只需根据编译参数的修改需求修改配置文件,而无需每次在修改编译参数时生成不同的容器,由此节省了资源,减少了工作量。

本申请实施例公开了一种具体的基于容器的编译方法,相对于上一实施例,本实施例对技术方案作了进一步的说明和优化。参见图2所示,具体包括:

步骤S21:在所述基础镜像内安装与社区地球系统模式对应的系统依赖库。

本实施例中的目标应用软件可以是社区地球系统模式,也即CESM。本实施例中,在所述基础镜像内安装与社区地球系统模式对应的系统依赖库之前,应确定与所述社区地球系统模式对应的netcdf(network Common Data Form,网络通用数据格式)依赖库。所述netcdf依赖库是一种面向数组型并适于网络共享的数据的描述和编码标准,广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。

步骤S22:基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,并根据与所述netcdf依赖库对应的依赖库脚本文件、所述基础镜像以及所述目标应用软件的脚本文件构建与所述目标应用软件对应的容器。

本实施例中,首先确定与所述netcdf依赖库对应的依赖库脚本文件以及基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,然后根据与所述netcdf依赖库对应的依赖库脚本文件、所述基础镜像以及所述目标应用软件的脚本文件构建与所述目标应用软件对应的容器。

步骤S23:基于预先创建的算例获取自定义编译参数,并将所述自定义线程数添加至配置文件中,以生成目标配置文件。

需要指出的是,本实施例预先基于自定义编译参数创建了算例,所述自定义编译参数包括但不限于算例名称、进程数、线程数以及分辨率,具体的,本申请给定一组编译参数,便自动创建一个算例,如此一来,在后续执行所述目标配置文件时,根据所述算例名称便可以得到各个编译参数。

步骤S24:通过执行所述目标配置文件,调用所述脚本文件以实现在所述容器内对所述目标应用软件的源代码进行编译。

其中,关于步骤S24更加具体的工作过程参见前述公开的实施例所示,在此不做具体赘述。

可见,本申请提出一种基于容器的编译方法,包括:在所述基础镜像内安装与社区地球系统模式对应的系统依赖库;基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,并根据与所述netcdf依赖库对应的依赖库脚本文件、所述基础镜像以及所述目标应用软件的脚本文件构建与所述目标应用软件对应的容器;基于预先创建的算例获取自定义编译参数,并将所述自定义线程数添加至配置文件中,以生成目标配置文件;通过执行所述目标配置文件,调用所述脚本文件以实现在所述容器内对所述目标应用软件的源代码进行编译,可见,相较于传统的每更改一次编译参数就对应生成一个容器的方法,本申请首先生成了一个容器,然后基于编译参数在容器外部生成了目标配置文件,如此一来,只需根据编译参数的修改需求修改配置文件,而无需每次在修改编译参数时生成不同的容器,由此节省了资源,减少了工作量。

本申请以CESM为例对所述基于容器的编译方法的具体实施过程进行描述,如下所示:

为了实现CESM的容器化,主要分为以下几个部分:

1、安装Singularity容器

安装Singularity可以分为以下几个步骤:

1.1、安装Go

由于Singularity应用是基于Go语言编写的程序,因此在安装Singularity之前需要安装go语言包。

1.2、指定Singularity版本,下载软件

1.3、源码编译Singularity软件

2、制作Singularity基础镜像

制作一个Singularity基础镜像,操作系统使用7.6.1810

3、制作应用镜像

本申请中,实现上述过程所需要的整体框架结构示意图参见图3、图4所示。所述框架结构示意图包括:源码及输入数据模块、依赖库安装模块、编译器模块、算例模块以及代码处理模块。

(1)源码及输入数据模块

源码及输入数据模块用于提供CESM的源码及算例运行时所需要的输入数据。该模块不包含在应用镜像内,在应用镜像外准备好之后映射到应用镜像内,参见图5所示。

(2)编译器模块

编译器模块包括所使用的编译器,也即编译算例时所需要的编译命令,该模块中的判断模块及环境变量设置模块在应用镜像内,由于编译器一般较大,因此编译器在应用模块外安装好后映射到应用镜像内。具体的。所述判断模块,用于判断所述基础镜像内是否存在编译命令,并当所述基础镜像内存在所述编译命令时,启动所述编译模块的工作流程,当所述基础镜像内不存在所述编译命令时,启动所述编译器模块中的环境变量设置模块的工作流程,所述环境变量设置模块,用于设置与所述编译命令相关的环境变量,以便生成所述编译命令,参见图6所示。

(3)依赖库安装模块

依赖库安装模块(指系统依赖库)中包含判断模块和安装模块,判断模块,用于判断当前基础镜像中是否已安装与目标应用软件对应的系统依赖库,并当所述基础镜像中已安装所述系统依赖库时,启动算例模块的工作流程,当所述基础镜像中未安装所述系统依赖库时,启动所述依赖库安装模块中的安装模块的工作流程。所述安装模块,用于在所述基础镜像中安装与所述目标应用软件对应的系统依赖库,参见图7所示。

(4)算例模块

算例模块包括算例创建模块、算例编译模块以及算例运行模块,所述算例创建模块用于创建算例;其中,所述创建算例包括赋予所述算例相关的参数;所述参数包括算例名称、分辨率、进程数以及线程数;所述算例编译模块用于使用编译器模块中的编译器对创建后的所述算例进行编译;所述算例运行模块用于运行编译后的所述算例,参见图8所示。

(5)代码处理模块

代码处理模块用于提供创建、编译并运行所述算例所需要的代码以及创建系统依赖库所需要的代码。

基于所述框架,本申请主要过程如下:确定与所述CESM对应的netcdf依赖库;从所述源码及输入数据模块中确定所述社区地球系统模式对应的源码及算例;通过依赖库安装模块在基础镜像内安装系统依赖库(csh、perl、perl-switch、perl-xml、which、cmake、gcc、libstdc++、libstdc++-devel、bzip2、glibc-headers、gcc-c++、m4、libcurl-dev、libcurl);根据所述netcdf依赖库的脚本文件lib_install.sh、基于CESM源码生成的脚本文件creat_compile.sh以及所述基础镜像构建与所述CESM对应的容器;在配置文件set.sh中给定自定义编译参数,所述自定义编译参数包括但不限于:算例名称、进程数、线程数以及分辨率,其中,算例名称由编译器+component+分辨率指定;通过编译器模块中的编译器对给定了所述自定义编译参数的所述配置文件进行编译,以生成目标配置文件;通过执行所述目标配置文件,调用所述脚本文件以实现在所述容器内对所述目标应用软件的源代码进行编译。如此一来,本申请能够自主判断基础镜像中是否存在相应的系统依赖库,并根据编译器的需求自主安装应用所需要的系统依赖库;此外本申请能够在容器内部自主编译应用,解决了CESM更换进程数后需要重新编译的问题,大大减少了应用使用者的工作量;本申请能够自主指定编译器,并且不需要在基础镜像内安装编译器、代码及输入数据,大大减少了基础镜像的大小,更便于使用;很多应用的版本和操作系统的版本是适用的,本申请解决了操作系统升级导致应用无法运行的问题。需要指出的是,本申请并不仅仅适用于CESM模式,对于任何需要随指定要求重新编译的应用都可以使用类似的方法进行纠正及验证。

相应的,本申请实施例还公开了一种基于容器的编译装置,参见图9所示,该装置包括:

系统依赖库安装模块11,用于在基础镜像内安装与目标应用软件对应的系统依赖库;

容器构建模块12,用于基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,并根据所述基础镜像和所述脚本文件构建与所述目标应用软件对应的容器;

目标配置文件生成模块13,用于获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件;

编译模块14,用于通过执行所述目标配置文件,调用所述脚本文件以实现在所述容器内对所述目标应用软件的源代码进行编译。

其中,关于上述各个模块更加具体的工作过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。

可见,本申请提出一种基于容器的编译方法,包括:在基础镜像内安装与目标应用软件对应的系统依赖库;基于所述目标应用软件的源代码确定所述目标应用软件的脚本文件,并根据所述基础镜像和所述脚本文件构建与所述目标应用软件对应的容器;获取自定义编译参数,并将所述自定义编译参数添加至配置文件中,以生成目标配置文件;通过执行所述目标配置文件,调用所述脚本文件以实现在所述容器内对所述目标应用软件的源代码进行编译。可见,相较于传统的每更改一次编译参数就对应生成一个容器的方法,本申请首先生成了一个容器,然后基于编译参数在容器外部生成了目标配置文件,如此一来,只需根据编译参数的修改需求修改配置文件,而无需每次在修改编译参数时生成不同的容器,由此节省了资源,减少了工作量。

进一步的,本申请实施例还提供了一种电子设备。图10是根据一示例性实施例示出的电子设备20结构图,图中的内容不能认为是对本申请的使用范围的任何限制。

图10为本申请实施例提供的一种电子设备20的结构示意图。该电子设备20,具体可以包括:至少一个处理器21、至少一个存储器22、显示屏23、输入输出接口24、通信接口25、电源26、和通信总线27。其中,所述存储器22用于存储计算机程序,所述计算机程序由所述处理器21加载并执行,以实现前述任一实施例公开的基于容器的编译方法中的相关步骤。另外,本实施例中的电子设备20具体可以为电子计算机。

本实施例中,电源26用于为电子设备20上的各硬件设备提供工作电压;通信接口25能够为电子设备20创建与外界设备之间的数据传输通道,其所遵循的通信协议是能够适用于本申请技术方案的任意通信协议,在此不对其进行具体限定;输入输出接口24,用于获取外界输入数据或向外界输出数据,其具体的接口类型可以根据具体应用需要进行选取,在此不进行具体限定。

另外,存储器22作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,其上所存储的资源可以包括计算机程序221,存储方式可以是短暂存储或者永久存储。其中,计算机程序221除了包括能够用于完成前述任一实施例公开的由电子设备20执行的基于容器的编译方法的计算机程序之外,还可以进一步包括能够用于完成其他特定工作的计算机程序。

进一步的,本申请实施例还公开了一种计算机可读存储介质,用于存储计算机程序;其中,所述计算机程序被处理器执行时实现前述公开的基于容器的编译方法。

关于该方法的具体步骤可以参考前述实施例中公开的相应内容,在此不再进行赘述。

本申请书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

以上对本申请所提供的一种基于容器的编译方法、装置、设备、存储介质进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

相关技术
  • 基于容器的程序编译方法、装置、电子设备及存储介质
  • 一种基于增量编译器的全量编译方法、装置、介质及设备
技术分类

06120114584007