CapRover

Service Update 覆盖

自 v1.8.0 起可用

尽管 部署前脚本 为服务定制提供了非常强的能力,但有时候它的能力对你的需求来说“过于强大”了。

例如,Docker 允许你通过 docker update command 设置只读卷、仅 UDP 的端口映射,以及很多其它定制参数(flags)。这些参数中有不少在 CapRover 中并没有直接提供,因为它们使用频率较低。但在某些场景下你确实需要其中一部分。对此,你可以在 CapRover 中提供一段用于覆盖的 JSON 或 YAML(Service Update Override)。

每次你部署新版本,或在应用里修改配置参数时,你的服务都会经历一次更新流程:

  1. CapRover 会更新你在 UI 中显式设置的字段(环境变量、实例数量等)。
  2. 如果存在 “Service Update Override”,CapRover 会用覆盖内容替换上一步的结果。
  3. 如果存在 “Pre-deploy script”,CapRover 会执行 pre-deploy 脚本。
  4. 最终结果会传给 Docker API,由 Docker 在底层完成服务更新。

结构

“Service Update Override” 同时支持 YAML 和 JSON。其结构需要匹配 Docker API 中的 Service Update Object。用 YAML 表示的话,大致如下。注意这只是一个片段示例,实际还有更多可用的定制参数。

TaskTemplate:
  ContainerSpec:
    Labels:
      some.label: some.value
    Image: busybox
    Command:
      - ./mycommand.sh
    Hostname: my.domain.com
    CapabilityAdd:
      - CAP_NET_ADMIN
    DNSConfig:
      Nameservers:
         - 8.8.8.8 
         - 8.8.4.4 
    Mounts:
      - Type: bind
        Source: /host/directory
        Target: /some/path/in/container
        ReadOnly: true
    Args:
      - top
  Resources:
    Limits:
      MemoryBytes: 104857600
      NanoCPUs: 2000000000
    Reservations:
      MemoryBytes: 104857600
      NanoCPUs: 2000000000
  RestartPolicy:
    Condition: any
    MaxAttempts: 0
  Placement:
    Constraints:
      - node.id==2ivku8v2gvtg4
  Networks:
    - Target: captain-overlay-network
  LogDriver:
    Name: json-file
    Options:
      max-size: 512m
  ForceUpdate: 0
Mode:
  Replicated:
    Replicas: 1
UpdateConfig:
  Parallelism: 2
  Delay: 1000000000
  FailureAction: pause
  Monitor: 15000000000
  MaxFailureRatio: 0.15
  Order: start-first
RollbackConfig:
  Parallelism: 1
  Delay: 1000000000
  FailureAction: pause
  Monitor: 15000000000
  MaxFailureRatio: 0.15
  Order: start-first
EndpointSpec:
  Mode: vip
  Ports:
    - Name: something
      Protocol: tcp
      TargetPort: 80
      PublishedPort: 8080
      PublishMode: host

示例用例

一个常见用例是限制某个服务的资源使用。此时你可以这样写:

TaskTemplate:
  Resources:
    Limits:
      MemoryBytes:	104857600
      NanoCPUs: 2000000000

这会将服务限制为 2 个 CPU 和 100MB 内存。你可以通过以下命令确认:

docker service inspect srv-captain--your-app-name --pretty

另一个用例是自定义启动命令:

TaskTemplate:
  ContainerSpec:
    Command: "./mycommand.sh"

如果你的容器需要为 Docker service 增加一些 CAP_ADD 权限,可以这样写:

TaskTemplate:
  ContainerSpec:
    CapabilityAdd:
      - CAP_SYS_ADMIN
      - CAP_NET_ADMIN

恢复默认行为

需要特别注意:CapRover 不会修改它不直接管理的现有 flags。CapRover 管理的 flags 包括环境变量、端口、镜像等少数几个。

如果你覆盖了一个不受 CapRover 管理的属性(比如上面的 CPU 限制),即便你后来删除覆盖内容,配置也不会自动恢复默认值,因为该设置已经写入 Docker 引擎。

因此,与其直接删除 override,更稳妥的做法是先把 override 改成另一个值,再删除。例如你想取消 CPU 和内存限制时:

  • 先把数值调到很高,比如内存 50GB、CPU 20 核
  • 然后再移除 override

当然,你也可以选择删除该 service 并重新创建一个新的。