如何用Jsonnet创建带别名的Docker Compose文件并处理引号问题
问题:用Jsonnet生成带YAML锚点的Docker Compose文件
现状Jsonnet代码
function(spec, service) { version: spec.version.compose_version, services: { [service + '-primary']: { image: '&image ' + spec.registry + '/' + service ':' + spec.version } } }
当前生成的YAML输出
"services": "ourproduct-primary": "image": "&image mycompany.com/ourproduct:${VERSION:-master}" "version": "3.9"
期望的正确YAML格式
version: '3.9' services: ourproduct-primary: image: &image mycompany.com/ourproduct:${VERSION:-master}
解决方案
1. 修复YAML锚点的引号问题
你当前的写法把YAML锚点&image和镜像地址拼接成了普通字符串,导致Jsonnet生成YAML时自动用双引号包裹整个内容。要让&image被识别为YAML锚点语法而非字符串的一部分,需要用std.parseYaml将锚点语法解析为Jsonnet可识别的特殊结构,再输出:
function(spec, service) { version: spec.version.compose_version, services: { [service + '-primary']: std.parseYaml('image: &image ' + spec.registry + '/' + service + ':' + spec.version)[0] } }
2. 控制版本号的引号格式
如果想让版本号输出为单引号包裹的格式(version: '3.9'),可以将版本号字段通过std.parseYaml转换为对应格式:
function(spec, service) { version: std.parseYaml("version: '" + spec.version.compose_version + "'")[0].version, services: { [service + '-primary']: std.parseYaml('image: &image ' + spec.registry + '/' + service + ':' + spec.version)[0] } }
3. 保留原文件生成逻辑
你的文件生成代码可以保持不变,确保传入的spec和service参数正确即可:
function(spec){ ['compose.%s.yaml' % service]: std.manifestYamlDoc(services[service](spec, service)) for service in spec.services }
修改后,std.manifestYamlDoc会正确生成不带引号的锚点语法,同时版本号也会按照期望格式输出。
内容的提问来源于stack exchange,提问作者jonathan tan
相关产品推荐
相关产品推荐

