json 使用jq排序和更新docker-compose.yaml

cgh8pdjw  于 4个月前  发布在  Docker
关注(0)|答案(2)|浏览(68)

这是我的docker-compose文件:

{
  "name": "movies-docker-test",
  "services": {
    "movies-rp": {
      "volumes": [
        {
          "type": "volume",
          "source": "certs",
          "target": "/etc/nginx/certs",
        },
        {
          "type": "bind",
          "source": "/home/nblanchet/jeudi_infra/kubernetes/okd/movies-docker-test/reverse-proxy/wikibase.conf.template",
          "target": "/etc/nginx/templates/wikibase.conf.template"
        }
      ]
    }
  }
}

字符串
我想更新这个文件,以便每个service的每个volumes都按'. type'排序:

{
  "name": "movies-docker-test",
  "services": {
    "movies-rp": {
      "volumes": [
        {
          "type": "bind",
          "source": "/home/nblanchet/jeudi_infra/kubernetes/okd/movies-docker-test/reverse-proxy/wikibase.conf.template",
          "target": "/etc/nginx/templates/wikibase.conf.template"
        },
        {
          "type": "volume",
          "source": "certs",
          "target": "/etc/nginx/certs"
        }
      ]
    }


我设法做到了这一点,但文件没有更新:

jq  '[.services[].volumes[]?]|sort_by(.type)'

ulydmbyx

ulydmbyx1#

给定file

name: movies-docker-test
services:
  movies-rp:
    volumes:
      - type: volume
        source: conf
        target: /etc/nginx/conf.d
      - type: volume
        source: certs
        target: /etc/nginx/certs
        read_only: true
      - type: bind
        source: /home/nblanchet/jeudi_infra/kubernetes/okd/movies-docker-test/reverse-proxy/uploadsize.conf
        target: /etc/nginx/conf.d/uploadsize.conf
      - type: bind
        source: /home/nblanchet/jeudi_infra/kubernetes/okd/movies-docker-test/reverse-proxy/wikibase.conf.template
        target: /etc/nginx/templates/wikibase.conf.template

字符串
然后,使用yq 4.40.3

$ yq e 'select(.services.*.volumes | select(tag == "!!seq")|=sort_by(.type))' file
name: movies-docker-test
services:
  movies-rp:
    volumes:
      - type: bind
        source: /home/nblanchet/jeudi_infra/kubernetes/okd/movies-docker-test/reverse-proxy/uploadsize.conf
        target: /etc/nginx/conf.d/uploadsize.conf
      - type: bind
        source: /home/nblanchet/jeudi_infra/kubernetes/okd/movies-docker-test/reverse-proxy/wikibase.conf.template
        target: /etc/nginx/templates/wikibase.conf.template
      - type: volume
        source: conf
        target: /etc/nginx/conf.d
      - type: volume
        source: certs
        target: /etc/nginx/certs
        read_only: true

的数据

dauxcl2d

dauxcl2d2#

下面是我用'' yq ''和 Package 的'' jq ''语法成功测试的结果

yq '.services|=with_entries(.value|=(select(has("volumes")).volumes |= sort_by((.type)) ))' docker-compose.yml

字符串
或者我最初对普通的“jq”做的

cat movies.yml | yq eval -ojson |  jq '.services|=with_entries(.value|=(select(has("volumes")).volumes |= sort_by((.type)) ))' | yq -P

相关问题