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

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代码时模拟黄瓜测试吗。我们应该在多大程度上使用黄瓜?   Hibernate Weblogic 10.3.4 java。lang.NoSuchMethodError:javax/persistence/spi/PersistenceUnitInfo。getValidationMode()Ljavax/persistence/ValidationMode;   java如何在main()中访问私有静态实例变量   java JMockit无法模拟类的公共final字段   java是否可以返回特定控制器操作的输出(html)?   java如何返回正确类型的列表?   rest-OpenUI/Swagger-java-to-API   java组织。springframework。豆。工厂NoSuchBeanDefinitionException或加载ApplicationContext失败   java使用POST将参数从JSP发送到Servlet   java如何监听特定的按钮按下和主视图用户交互?   java如何让gradle在本地maven repo中覆盖库?   如何在Java中“合并”两个URI?   java如何制作一个方法来移动数组中的字符?   使用来自java的命令启动powershell窗口   java垃圾收集器和匿名类   java如何为CellTable(GWT 2.4)中的ImageResourceCell创建PanelPopup?