部署:创建应用的新版本
每次调用都会创建一个版本,由调用给出的内容构成,未给出的部分沿用应用现有的;应用自身的字段也随之变为该版本的构成。再次部署同一个标签也是一个新版本:届时这个标签可能已指向另一个镜像。版本在应用的各节点上构建,所有节点都准备好后才承接应用的流量(带 wait_seconds 对它发起 GET 即可等待)。所需权限范围:write;给应用指定它还没有的机密时还需要 admin。
https://api.glac.ai/v1/apps/{app}/versions授权
路径参数
请求头参数
请求体JSON可选
- volumesoptionalarray | null
其实例挂载的东西,随之后创建的每个版本保存:项目的存储卷 (
POST /v1/volumes),按写下的名称或 id 指定,在创建或修改应用以及部署版本时逐一查找 (404volume_not_found)。不能有两个挂载在同一路径上。带自有存储卷(非共享的)的服务是有状态服务:只有一个实例,由它持有存储卷(scale.max_instances为 1 或 null,scale.min_instances为 0 或 1,不带keys:否则返回 400volume_single_instance),运行在其存储卷所在的机器上,这些存储卷必须在同一台机器上 (409volumes_apart)。其版本在那里构建,并推迟启动命令;实例创建在服务在项目网络中的地址上,名称与服务相同(或按hostname指定),先挂载存储卷(新存储卷会写入镜像在该路径上的内容,除非指定了nocopy),然后启动命令,按ready的判断启动完成后开始接受连接;每次从其磁盘启动都是如此。它像任何键控实例一样休眠(scale.sleep_after_ms;下限为 1 时从不休眠),由项目网络上的连接唤醒,只能由其所有者删除,或随应用一起删除。之后部署的版本会替换它:按stop的设置停止旧实例的命令,用同样的存储卷在同一地址创建新实例,新实例启动后流量切换给它;新实例没能启动时,会用离开时状态的存储卷重新创建之前的版本,部署失败,并附上新实例的输出 (app.deploy_failed)。不给出时:没有。 - drivesoptionalarray | null
其实例以读写方式挂载的云盘 (slice D8),随之后创建的每个版本保存:项目的云盘,按写下的名称或 id 指定,在创建或修改应用以及部署版本时逐一查找(404
drive_not_found;其他类型的存储卷不算)。带云盘的服务是有状态服务,与带自有存储卷 (volumes) 的服务一样:只有一个实例,由它持有云盘,创建在持有这些云盘的节点上,或者创建在同一区域中云盘被搬过去的另一个节点上。一个云盘只能有一个写入者:多实例的应用(scale.max_instances不是 1 或 null,scale.min_instances大于 1,或带keys)会被拒绝,返回 409drive_single_writer;云盘快照的只读挂载可以有多个,但那是沙箱的功能(mode为snapshot,slice D7),应用的版本暂不支持挂载;带键的应用会为每个键提供一个自有云盘 (key_drives)。其存储卷和云盘不能挂载在同一路径上;一个实例最多挂载 8 个自有云盘和存储卷 (409too_many_drives)。不给出时:没有。 - key_drivesoptionalarray | null
每个键的实例自有的云盘(slice D8;reports/workers/keyed-upgrade.md,那里叫
key_volumes),只适用于键控应用(keys;否则返回 400invalid_field),随之后创建的每个版本保存。键的云盘在其第一个实例创建时创建,位于该实例所在的节点和区域,并在其启动命令运行之前挂载(其版本构建时会推迟启动命令);该键此后的每个实例(第一个实例因空闲或按 id 被删除后)都按名称挂载同样的云盘;把实例升级到指定了其他云盘的版本时,也按名称挂载它们:版本指定了而键还没有的云盘会在那时创建,版本不再指定的云盘不再挂载但会保留 (POST /v1/apps/{app}/instances/{key}/upgrade);它们随键一起删除 (DELETE /v1/apps/{app}/instances/{key}),或随应用一起删除。键的云盘会出现在GET /v1/volumes中,带有其app_id和key,像任何云盘一样计费,计入项目云盘的合计大小但不计入数量,项目不能删除它,也不能把它挂载到别处 (409key_drive)。不给出时:没有。
Returns
201
版本,状态为 building。
- errorobject | nullrequired
失败的原因。错误码可能来自节点,与沙箱以同样方式失败时相同(
image_not_found:镜像不在其仓库中,或者不是公开的,对于没有指定image_pull_secret的版本,需要登录的仓库只会这样说;image_pull_failed;registry_auth_failed:仓库拒绝了image_pull_secret中的凭据,message末尾附有仓库的原话,不含凭据;image_unpack_failed、invalid_image、boot_failed:启动命令没能启动,message中有就绪检查得到的结果以及启动命令最后打印的内容,使用镜像自己的原话),也可能是节点对版本构成的拒绝(invalid_field等),或者控制平面自己的错误码:secret_not_found和secret_unreadable(要求节点构建时,版本指定的某个机密已不存在或无法读取;message会指明是哪一个)、invalid_field(image_pull_secret的机密已不再包含用户名和密码)、secret_host_not_allowed(image_pull_secret的机密已不允许发往镜像所在的仓库;message会指明机密、仓库及其可以发往的地方)、no_capacity(没有机器可以构建它,或节点没有空闲槽位)、drive_full(能构建它的机器的数据盘上都没有空间容纳其模板:message为其中第一台机器给出的说明,即其数据盘的使用情况;如果另一台有空间,就在那里构建)、build_failed(节点自身的某一步失败了)、节点在查询镜像信息或构建时连续三次以同样方式失败时给出的错误码(internal:message中有其原话、返回的状态码以及请求 id,节点日志按这个 id 记录了原因)、template_differs、runtime_not_supported(某个要服务它的节点运行的 sandboxd 早于运行时设置功能,在没有版本runtime的情况下不会构建任何东西)、deploy_stalled(某台要构建它的机器两分钟内没有取走任何东西:message中有它的说明)、deploy_timed_out。