Service Update 覆盖
自 v1.8.0 起可用
尽管 部署前脚本 为服务定制提供了非常强的能力,但有时候它的能力对你的需求来说“过于强大”了。
例如,Docker 允许你通过 docker update command 设置只读卷、仅 UDP 的端口映射,以及很多其它定制参数(flags)。这些参数中有不少在 CapRover 中并没有直接提供,因为它们使用频率较低。但在某些场景下你确实需要其中一部分。对此,你可以在 CapRover 中提供一段用于覆盖的 JSON 或 YAML(Service Update Override)。
每次你部署新版本,或在应用里修改配置参数时,你的服务都会经历一次更新流程:
- CapRover 会更新你在 UI 中显式设置的字段(环境变量、实例数量等)。
- 如果存在 “Service Update Override”,CapRover 会用覆盖内容替换上一步的结果。
- 如果存在 “Pre-deploy script”,CapRover 会执行 pre-deploy 脚本。
- 最终结果会传给 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 并重新创建一个新的。