在沙盒中运行不受信任的命令。

sandcastle的Python项目详细描述


沙堡Build Status

在沙箱中的城堡(openshift pod)中运行不受信任的代码。

用法

先决条件是您已登录到openshift集群:

$ oc status
 In project Local Project (myproject) on server https://localhost:8443

最简单的用例是在新的openshift pod中调用命令:

fromsandcastleimportSandcastles=Sandcastle(image_reference="docker.io/this-is-my/image:latest",k8s_namespace_name="myproject")output=s.run(command=["ls","-lha"])

这些事情将会发生:

  • 使用image_reference中的图像集创建一个新的pod。
  • 库会主动等待pod完成。
  • 如果pod以大于0的返回代码终止,则会引发异常。
  • 命令的输出是从.run()方法返回的。

沙盒和当前pod之间共享数据

这个库允许您在运行它的pod之间和沙盒之间共享卷。

有一个专用类和一个接口来访问此功能:

  • VolumeSpec
  • volume_mounts沙堡建造师夸格

一个例子胜过千言万语:

frompathlibimportPathfromsandcastleimportSandcastle,VolumeSpec# the expectation is that volume assigned to PVC set# via env var SANDCASTLE_PVC is mounted in current pod at /pathvs=VolumeSpec(path="/path",pvc_from_env="SANDCASTLE_PVC")s=Sandcastle(image_reference="docker.io/this-is-my/image:latest",k8s_namespace_name="myproject",volume_mounts=[vs])s.run()s.exec(command=["bash","-c","ls -lha /path"])# will be emptys.exec(command=["bash","-c","mkdir /path/dir"])# will create a dirassertPath("/path/dir").is_dir()# should pass

通过复制共享数据

sandcastle能够在不同的名称空间中运行沙盒pod。这个 提高了安全性,因为锁定此项目的网络很简单- pod将无法访问openshift api服务器或您的任何服务 部署在群集中。有关详细信息,请查看egress rules 以及network policy

设置此沙盒命名空间时,请确保服务帐户 您的应用程序部署在沙盒命名空间中的can manage pods中。 此命令应有帮助:

$ oc adm -n ${SANDBOX_NAMESPACE} policy add-role-to-user edit system:serviceaccount:${APP_NAMESPACE}:default

实际代码:

m_dir=MappedDir(local_dir,# share this dirsandbox_mountpoint,# make it available herewith_interim_pvc=True# the data will be placed in a volume)o=Sandcastle(image_reference=container_image,k8s_namespace_name=namespace,# can be a different namespacemapped_dir=m_dir,working_dir=sandbox_mountpoint,)o.run()# happy execingo.exec(command=["ls","-lha",f"{sandbox_mountpoint}/"])

开发沙堡

为了开发这个项目(并运行测试),需要满足几个需求。

  1. 使用makefile targetmake test-image-build生成容器映像。

  2. 一个openshift集群并将其登录

    这意味着运行oc status应该在需要的地方产生集群 运行测试。

    e2e测试test_from_pod构建当前代码库并运行另一个e2e POD中的测试:验证E2E功能。这意味着 openshift集群部署在当前环境中,这意味着 openshift可以访问Dockerd中的本地容器图像。否则 图像需要推到某个地方,以便openshift可以访问它。

  3. 在默认的oc cluster up环境中,测试创建沙盒pod 使用分配给每个pod的默认服务帐户。这个SA 不具有创建或删除POD的权限(因此沙箱将 不工作)。使用此命令,SA可以更改 名称空间:

    oc adm policy add-role-to-user edit system:serviceaccount:myproject:default
    
  4. Docker二进制和Docker守护进程正在运行。这是从第一点暗示的。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在sqlite数据库中保存特定列的历史记录   java如何更改/更新timeseriechart名称(JFreeChart)   java如何将整数转换为可绘制的   汇编什么解释Java的字节码   java查找已编译的类版本号   我应该什么时候在ColdFusion应用程序中使用Java?   java当一个实体的两个字段为(unique=true)时,如何处理JPA异常?   java为什么在所有其他实例都正确的情况下返回错误的布尔值?   java Hibernate每次都准备语句   java停留在平均字长上   对Java和日语字符进行编码   java如何将导致异常的方法的错误消息传递给侦听器中的onTestFailure方法   java代码没有打印结果   java为什么私有内部接口的方法必须是公共的?   休眠发生错误。有关详细信息,请参阅错误日志。JAVAlang.NullPointerException