部署前脚本
这是一个非常高级的操作,需要格外谨慎。否则,它可能会破坏你的应用部署。
当由于配置变更或部署导致你的容器(也就是应用)即将更新时,这个脚本会在更新前立刻执行。在这个脚本里,你可以修改 Docker service 对象、发起 HTTP 请求,几乎可以做任何事。脚本模板如下:
var preDeployFunction = function (captainAppObj, dockerUpdateObject) {
return Promise.resolve()
.then(function(){
// Do something in a Promise form
// In the end, return the "possibly-modified" dockerUpdateObject
return dockerUpdateObject;
});
};注意:captainAppObj 是保存在 /captain/data/config-captain.json 文件中的应用对象;dockerUpdateObject 是传给 Docker 用于更新 service 的更新对象(环境变量、镜像版本等)。该对象的结构参考 Docker 文档。
由于这个脚本会在 CapRover 进程中执行,你可以使用 CapRover 已经安装的全部 Node 依赖,见 Caprover/caprover/package.json。例如,下面的脚本会在每次更新时,把一个与 deployed version 相关联的 UUID 写入 service label:
var { v4: uuid } = require('uuid');
var preDeployFunction = function (captainAppObj, dockerUpdateObject) {
return Promise.resolve()
.then(function(){
dockerUpdateObject.TaskTemplate.ContainerSpec.Labels[uuid()] =
captainAppObj.deployedVersion+ '';
return dockerUpdateObject;
});
};请注意:这个部署前脚本(尤其是 Docker service update object)非常复杂。因此,强烈建议只有专家用户才使用这种部署前方法。比如,请留意下面这行是如何给 deployed version 拼接一个空字符串的:
dockerUpdateObject.TaskTemplate.ContainerSpec.Labels[uuid()] = captainAppObj.deployedVersion+ '';如果去掉这个简单的小技巧,部署应用时就会抛错。要查看日志,你需要运行 docker service logs captain-captain --follow。而且即使是 Docker 返回的错误信息也不太清晰。总之,这是一个高级功能,不建议初学者和中级用户使用。