You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:34:53