修改应用
JSON Merge Patch。修改版本的构成(image、start_command、port、ready、env、secrets、size)会为有镜像的应用部署一个新版本;修改其余部分(name、regions、scale、keys、egress、metadata)立即生效,不产生新版本:服务该应用的节点会收到其规模和标签的变更。null 把字段恢复为未设置时的值;image 和 name 不能移除。没有改变任何东西的补丁不会写入任何东西。所需权限范围:write;给应用指定它还没有的机密时还需要 admin。对于项目的默认沙箱应用(sbx-sandbox,managed_by 为沙箱产品),补丁只接受 image:一个镜像引用,或 null 表示基础模板:会用它创建一个新版本(返回 200 和应用,current_version 为新版本;再给同一个镜像不会产生新版本),此后项目中不指定镜像的创建请求都从这个版本创建;其他任何修改都返回 409 managed_by_sandboxes,与对这类镜像应用的任何修改一样。
https://api.glac.ai/v1/apps/{app}授权
路径参数
请求体JSON可选
- image_pull_secretoptionalstring | null
项目中某个机密 (
/v1/secrets) 的名称,该机密保存非公开镜像所在仓库的凭据:可打印 ASCII 格式的username:password,用户名到第一个冒号为止;只接受令牌的仓库会说明与令牌搭配的用户名(ECR 为AWS,Google 的为oauth2accesstoken,GHCR 任何名称均可)。该值会随镜像发给每个构建版本的节点,在那里只交给拉取镜像的工具:实例、模板、事件和日志中都不会有它的任何内容,仓库拒绝它时给出的说明会作为版本的error返回,不含该值 (registry_auth_failed)。指定它需要write权限范围,不需要admin。创建版本时,该机密必须存在 (404secret_not_found),且保存的是这样一对凭据 (400invalid_field);部署在请求节点时读取它。在PATCH中,null表示移除。不给出时:不使用凭据,不登录直接向仓库请求镜像。maxLength: 128 - envoptionalobject | null
启动命令的环境变量,在镜像自身的环境变量之后设置。值可以单独或嵌在其他文本中引用项目中另一个服务的变量、应用自身的变量,或项目的某个共享变量:
${{ db.POSTGRES_USER }}、${{ shared.REGION }}。服务的变量包括其env(会跟随其中的引用)、其secrets,以及平台提供的四个变量(SBX_SERVICE,服务名称;SBX_PRIVATE_DOMAIN,<name>.internal;SBX_PRIVATE_ADDRESS,服务在项目网络中的地址;SBX_PROJECT,项目的 id)。版本保存的是创建时解析出的值:应用保存的是原样写下的内容。引用机密会让该变量成为那个机密,与secrets的效果相同:它必须是整个值,如果应用还没有该机密,需要admin。每个${{都表示一个引用的开始(400invalid_reference,param指向该变量);循环引用,或引用了不存在的服务或变量,会在创建版本时被拒绝 (400invalid_reference),引用已删除的机密也一样 (404secret_not_found)。 - 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)。不给出时:没有。 - 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)。不给出时:没有。
Returns
200
修改后的应用,以及 made_version:这次修改产生的版本,没有产生则为 null。
- managed_byobject | nullrequired
唯一能修改它的东西(如果有的话)。
object为database:它所属的数据库(id,见/v1/databases);其他任何会修改它的调用都会被拒绝,返回 409managed_by_database。object为sandboxes(id为 null):属于沙箱产品,由项目的沙箱创建请求 (POST /v1/sandboxes) 创建:项目的默认沙箱应用sbx-sandbox(其image为 null:每个沙箱都从其所在节点的基础模板创建,直到项目为它指定一个镜像:只带image的PATCH,用该镜像创建一个新版本,此后不指定镜像的创建请求都从这个版本创建),或者某个创建请求指定的镜像的应用(image,与创建请求指定的一致;sbx-<the image's name>-<12 hex digits>,一个版本)。版本创建即就绪,应用的实例就是项目的沙箱;除了读取它及其版本、为默认沙箱应用指定镜像和删除它(其各版本的模板随之删除;下一个指定该镜像或不指定镜像的创建请求会重新创建它)之外,对它的任何调用都会被拒绝,返回 409managed_by_sandboxes。null:不受任何东西管理。object为installation:它所属的托管应用安装(id,见/v1/installations),只有该安装能修改它:其他任何会修改它的调用都会被拒绝,返回 409managed_by_installation。 - checkpointrequired
键控实例运行期间的检查点:每隔
every_seconds秒(默认 10,取值 1 到 600),把实例在某一时刻的内存和磁盘送到其节点的对象存储;节点的宿主机丢失时,实例会在另一个节点上从最新的检查点连同进程一起被接管,最多丢失此后做的事(休眠的实例从休眠状态接管,不会丢失任何东西)。每次节点会把它暂停几毫秒;发送的是自上一个检查点以来写入的内容,经过压缩;写入速度超过节点检查点链路承载能力的实例会落后,而不是把链路占满(实例的checkpoint:last_at、behind_seconds、bytes_per_second、stored_bytes)。对象存储为实例最新检查点保存的数据,在实例运行期间按休眠状态 (state) 计费;发送的数据不计费。立即生效,不产生新版本:现有的实例会立即启用,之后创建的实例创建时就带有它。不适用于有状态服务的实例:其存储卷在对象存储中没有副本。实例的云盘(包括它自己的key_drives)会与磁盘在同一时刻固定下来,接管时恢复到那一刻的状态;挂载了非云盘存储卷的实例不会创建检查点,其checkpoint.error会说明这一点。null:不启用(默认)。