क्या शेल स्क्रिप्ट के माध्यम से एक 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.