CapRover

部署前脚本


这是一个非常高级的操作,需要格外谨慎。否则,它可能会破坏你的应用部署。

当由于配置变更或部署导致你的容器(也就是应用)即将更新时,这个脚本会在更新前立刻执行。在这个脚本里,你可以修改 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 返回的错误信息也不太清晰。总之,这是一个高级功能,不建议初学者和中级用户使用。