क्या शेल स्क्रिप्ट के माध्यम से एक yml फ़ाइल को संशोधित करना संभव है?


12

यह मेरा डॉकटर-कंपोज़ है।लिमल कैसा दिखता है।

nginx:
  container_name: 'nginx'
  image: 'nginx:1.11'
  restart: 'always'
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
  links:
    - 'anything'

अब मुझे शेल स्क्रिप्ट (एक ubuntu सर्वर पर) के माध्यम से कुछ सामग्री जोड़ने की आवश्यकता है। मुझे पूरा यकीन नहीं है कि यह संभव है:

  1. नया तत्व जोड़ें nginx/links, अगर यह मौजूद नहीं है
  2. newthingयदि कोई नया-ब्लॉक मौजूद नहीं है, तो ब्लॉक को जोड़ें

नई सामग्री इस तरह दिखनी चाहिए:

nginx:
  container_name: 'nginx'
  image: 'nginx:1.11'
  restart: 'always'
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
    - '/etc/letsencrypt:/etc/letsencrypt'
  links:
    - 'anything'
    - 'newthing'

newthing:
  container_name: foo
  image: 'newthing:1.2.3'
  restart: always
  hostname: 'example.com'

1
शेल आपको बहुत शक्तिशाली स्क्रिप्टिंग भाषा प्रदान करता है। आप आसानी से एक स्क्रिप्ट का उपयोग कर लिख सकते हैं sed, awkऔर regular expressionsअपनी फ़ाइल को अपडेट करने के लिए।
— जीवाश्म

क्या आप कृपया एक छोटा सा उदाहरण प्रदान कर सकते हैं?
— user3142695

2
हालांकि यह शेल का उपयोग करके तकनीकी रूप से संभव है, आपको एक ऐसी भाषा का उपयोग करने से बेहतर होना चाहिए जिसमें वास्तविक यम लाइब्रेरी है।
— जोर्डनम

मैं आपको सलाह दूंगा कि आप ruamel.yamlपायथन के लिए पुस्तकालय देखें।
— phk

मुझे लगता है कि यह ध्यान देने योग्य है कि लिंक एक विरासत विशेषता है जिसे भविष्य में docker
— Mikael Kjær

जवाबों:


6

पर्ल, पाइथन आदि के लिए कई यमल लाइब्रेरी हैं, अगर यह सीधे तौर पर एक शेल स्क्रिप्ट से नहीं है, लेकिन दूसरी भाषा का उपयोग करें।

एक अन्य विकल्प कमांड-लाइन यम प्रोसेसर स्थापित करना है , और इसे अपने शेल स्क्रिप्ट से कॉल करना है।


8

मैंने https://github.com/kislyuk/yq , इस उपयोग के मामले को संबोधित करने के लिए https://stedolan.github.io/jq/ के आसपास एक आवरण लिखा है ।


क्या यह अपडेट कर सकता है?
— वीमेनहैम

1
यः yq -y '.newthing=...' input.yml > output.yml। (आप जगह में एक अद्यतन के बारे में पूछ रहे हैं, तो जैसे sed -i, yq यह अपने आप में क्या कर सकते हैं अभी तक नहीं है, लेकिन आप उपयोग कर सकते हैं sponge: yq -y .newthing=... file.yml | sponge file.yml।)
— बुनकर

1
@ आप मेरे नए हीरो हैं
— voutasaurus

7

मैंने yaml_cli ( https://github.com/Gallore/yaml_cli ) को ठीक वही करने के लिए लिखा है जिसकी आपको आवश्यकता है। यह अजगर पर आधारित है। यह आपके उदाहरण के लिए वाक्यविन्यास होगा:

yaml_cli \
  -f docker-compose.yml \                # read from and save to file
  --list-append \                        # flag to append to lists instead of replacing existing values
  -s nginx:links newthing \              # add a value of type string; here you need --list-append
  -s newthing:container_name foo \       # key 'newthing' is created automatically
  -s newthing:image 'newthing:1.2.3' \   #
  -s newthing:restart always \           #
  -s newthing:hostname 'example.com'     #

Yaml_cli के बारे में प्रतिक्रिया की सराहना की गई है।


1

चूंकि आप ऐसा करना चाहते हैं, इसलिए एक डॉक-कंपोज़ फ़ाइल को संशोधित करना है, एक अन्य विकल्प JSON फ़ाइल का उपयोग करना है। डॉकर-रचना अब JSON फ़ाइलों का समर्थन करती है । JSONs के कमांड-लाइन हेरफेर के लिए समर्थन पहले से ही बहुत अच्छा है (उदा: jq )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.