कुबेरनेट्स के साथ एक यामल फ़ाइल में कई कमांड कैसे सेट करें?


94

इस आधिकारिक दस्तावेज में, यह एक yaml config फाइल में कमांड चला सकता है:

https://kubernetes.io/docs/tasks/configure-pod-container/

apiVersion: v1
kind: Pod
metadata:
  name: hello-world
spec:  # specification of the pod’s contents
  restartPolicy: Never
  containers:
  - name: hello
    image: "ubuntu:14.04"
    env:
    - name: MESSAGE
      value: "hello world"
    command: ["/bin/sh","-c"]
    args: ["/bin/echo \"${MESSAGE}\""]

अगर मैं एक से अधिक कमांड चलाना चाहता हूं, तो मुझे कैसे करना है?

जवाबों:


147
command: ["/bin/sh","-c"]
args: ["command one; command two && command three"]

स्पष्टीकरण:command ["/bin/sh", "-c"] कहते हैं "एक खोल चलाने के लिए, और निम्नलिखित निर्देशों पर अमल"। तब आर्गल्स को शेल के कमांड के रूप में पास किया जाता है। शेल स्क्रिप्टिंग में एक अर्धविराम कमांड को अलग करता है, और &&यदि पहली बार सफल होता है तो सशर्त रूप से निम्न कमांड चलाता है। उपरोक्त उदाहरण में, यह हमेशा command oneउसके बाद चलता है command two, और केवल तभी चलता है command threeजब command twoसफल होता है।

वैकल्पिक: कई मामलों में, कुछ कमांड जिन्हें आप चलाना चाहते हैं, संभवतः चलाने के लिए अंतिम कमांड सेट कर रहे हैं। इस मामले में, अपनी खुद की डॉकरफाइल का निर्माण करने का तरीका है। विशेष रूप से RUN निर्देश देखें।


1
हां, बहुत वैध है, हालांकि, मुझे लगता है कि इसका उपयोग करने के लिए भी अच्छे उपयोग के मामले हैं commandक्योंकि यह डॉकफर्इल को आगे बढ़ाता है Entrypoint;)
माइकल होसेनब्लास

1
कंटेनर जीवन चक्र के साथ ऐसा करने के बारे में कोई विचार? यह कोई args नहीं है
aclokay

1
@aclokay आप केवल अतिरिक्त कमांड स्ट्रिंग्स के रूप में तर्क निर्दिष्ट कर सकते हैं। कंटेनर में कमांड और आर्ग्स के बीच अलगाव तर्क को आसान बनाने के लिए है। वे कार्यात्मक रूप से समतुल्य हैं।
टिम एलक्लेयर

यहाँ क्या करता है?
अब्दुल

1
@ अब्दुल का अर्थ है, एक संवादात्मक खोल शुरू करने या किसी फ़ाइल से स्क्रिप्ट को लोड करने के बजाय एक तर्क के रूप में प्रदान की गई स्क्रिप्ट को चलाना।
टिम अल्क्लेयर

76

मेरी प्राथमिकता आर्गों को बढ़ाना है, यह सबसे सरल और पढ़ने में आसान है। इसके अलावा, स्क्रिप्ट को छवि को प्रभावित किए बिना बदला जा सकता है, बस पॉड को पुनरारंभ करने की आवश्यकता है। उदाहरण के लिए, एक mysql डंप के लिए, कंटेनर कल्पना कुछ इस तरह हो सकती है:

containers:
  - name: mysqldump
    image: mysql
    command: ["/bin/sh", "-c"]
    args:
      - echo starting;
        ls -la /backups;
        mysqldump --host=... -r /backups/file.sql db_name;
        ls -la /backups;
        echo done;
    volumeMounts:
      - ...

इसका कारण यह है कि यमल वास्तव में "-" एक के बाद सभी लाइनों को समेटता है, और एक लंबी स्ट्रिंग "इको स्टार्टिंग; ls ...; इको किया";


अच्छा है, लेकिन जब आप kubectl के साथ एक संपादन का अनुरोध करते हैं, तो यह फिर से एक पंक्ति में होगा। :)
अक्टूबर को

@sekrett ओह नहीं! :(
एकलोकेय

1
यह काफी अच्छी तरह से काम किया - कुंजी प्रत्येक पंक्ति पर अर्धविराम है। यह एक विशेष रूप से अच्छा समाधान है जब कमांड कई हैं और उपरोक्त समाधान के साथ बहुस्तरीय होगा। बनाता है एक हवा अलग
केलीफज

यह वही है जिसे मैं देख रहा था। इस समाधान के साथ तर्क के रूप में पर्यावरण चर का उपयोग करना अच्छी तरह से काम करता है।
जिंगपेंग वू

+1 सुंदर, प्लस मल्टी-लाइन कमांड पूरी तरह से काम करते हैं: command: ['/bin/bash', '-c'] args: - exec &> /path/to/redirected/program.output;`पाइथन / प्रोग्रामहोम`` --key1 = val1`` -key2 = val2` `-key3 = val3`
नेल्सनस्प्रे

46

यदि आप वॉल्यूम और कॉन्फिगरेशन का उपयोग करने के इच्छुक हैं, तो आप कॉन्फिगरेशन डेटा को स्क्रिप्ट के रूप में माउंट कर सकते हैं , और फिर उस स्क्रिप्ट को चला सकते हैं:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  entrypoint.sh: |-
    #!/bin/bash
    echo "Do this"

    echo "Do that"
---
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: "ubuntu:14.04"
    command:
    - /bin/entrypoint.sh
    volumeMounts:
    - name: configmap-volume
      mountPath: /bin/entrypoint.sh
      readOnly: true
      subPath: entrypoint.sh
  volumes:
  - name: configmap-volume
    configMap:
      defaultMode: 0700
      name: my-configmap

यह आपकी फली कल्पना को थोड़ा साफ करता है और अधिक जटिल स्क्रिप्टिंग के लिए अनुमति देता है।

$ kubectl logs my-pod
Do this
Do that

1
बहुत अच्छा है, लेकिन मुझे लगता है कि स्क्रिप्ट इनलाइन होना सरल है, बस मल्टीलाइन सिंटैक्स का उपयोग करें। मैं इसे एक अलग उत्तर में दिखाता हूं।
ओलिवर

जब मुझे दोहरे उद्धरण चिह्नों को पास करने की आवश्यकता होती है तो क्या होगा उदाहरण के लिए इस कमांड की कल्पना करें: printf '% s @% s \ n' "$ (गूंज 'उपयोगकर्ता')" "$ (गूंज 'मेजबान')"
L3K0V

15

यदि आप सभी आदेशों को एक ही आदेश में समाहित करने से बचना चाहते हैं ;या &&आप एक हेरेड का उपयोग करके सच्ची बहु-पंक्ति स्क्रिप्ट प्राप्त कर सकते हैं:

command: 
 - sh
 - "-c"
 - |
   /bin/bash <<'EOF'

   # Normal script content possible here
   echo "Hello world"
   ls -l
   exit 123

   EOF

यह मौजूदा बैश स्क्रिप्ट को चलाने के लिए आसान है, लेकिन इसमें हेरेडोक की स्थापना के लिए आंतरिक और बाहरी शेल उदाहरण दोनों की आवश्यकता होती है।


3

IMHO सबसे अच्छा विकल्प YAML के देशी ब्लॉक स्केलर का उपयोग करना है । विशेष रूप से इस मामले में, मुड़ा हुआ शैली ब्लॉक।

आह्वान करके sh -cआप अपने कंटेनर को आदेशों के रूप में तर्क दे सकते हैं, लेकिन यदि आप उन्हें नए सिरे से अलग करना चाहते हैं, तो आप तह शैली ब्लॉक का उपयोग करना चाहते हैं , ताकि YAML को नई सूचियों को व्हाट्सएप में परिवर्तित करने के लिए, प्रभावी ढंग से आदेशों को संक्षिप्त करने के लिए पता चल जाएगा।

एक पूर्ण कार्य उदाहरण:

apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  containers:
  - name: busy
    image: busybox:1.28
    command: ["/bin/sh", "-c"]
    args:
    - >
      command_1 &&
      command_2 &&
      ... 
      command_n

1

मुझे यकीन नहीं है कि प्रश्न अभी भी सक्रिय है लेकिन इस तथ्य के कारण कि मुझे उपरोक्त उत्तर में समाधान नहीं मिला था, मैंने इसे लिखने का फैसला किया।

मैं निम्नलिखित दृष्टिकोण का उपयोग करता हूं:

readinessProbe:
  exec:
    command:
    - sh
    - -c
    - |
      command1
      command2 && command3

मुझे पता है कि मेरा उदाहरण तत्परता से संबंधित है, linyProbe, आदि, लेकिन संदेह है कि एक ही मामला कंटेनर कमांड के लिए है। यह लचीलापन प्रदान करता है क्योंकि यह बैश में एक मानक स्क्रिप्ट लेखन को दर्पण करता है।


0

यहां बताया गया है कि कुबेरनेट्स के साथ एक YAML फ़ाइल में आप कितने पास और तर्क दे सकते हैं:

# Write your commands here
command: ["/bin/sh", "-c"]
# Write your multiple arguments in args
args: ["/usr/local/bin/php /var/www/test.php & /usr/local/bin/php /var/www/vendor/api.php"]

पूर्ण कंटेनर yaml फ़ाइल से ब्लॉक होते हैं:

    containers:
      - name: widc-cron # container name
        image: widc-cron # custom docker image
        imagePullPolicy: IfNotPresent # advisable to keep
        # write your command here
        command: ["/bin/sh", "-c"]
        # You can declare multiple arguments here, like this example
        args: ["/usr/local/bin/php /var/www/tools/test.php & /usr/local/bin/php /var/www/vendor/api.php"]
        volumeMounts: # to mount files from config-map generator
          - mountPath: /var/www/session/constants.inc.php
            subPath: constants.inc.php
            name: widc-constants

0

बस एक और संभावित विकल्प लाने के लिए, रहस्यों का उपयोग तब किया जा सकता है, जब वे पॉड के रूप में प्रस्तुत किए जाते हैं:

गुप्त उदाहरण:

apiVersion: v1
kind: Secret 
metadata:
  name: secret-script
type: Opaque
data:
  script_text: <<your script in b64>>

यमल अर्क:

....
containers:
    - name: container-name
      image: image-name
      command: ["/bin/bash", "/your_script.sh"]
      volumeMounts:
        - name: vsecret-script
          mountPath: /your_script.sh
          subPath: script_text
....
  volumes:
    - name: vsecret-script
      secret:
        secretName: secret-script

मुझे पता है कि कई लोग यह तर्क देंगे कि रहस्यों का क्या उपयोग किया जाना चाहिए, लेकिन यह एक विकल्प है।


0

यहाँ मेरा सफल रन है

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: busybox
  name: busybox
spec:
  containers:
  - command:
    - /bin/sh
    - -c
    - |
      echo "running below scripts"
      i=0; 
      while true; 
      do 
        echo "$i: $(date)"; 
        i=$((i+1)); 
        sleep 1; 
      done
    name: busybox
    image: busybox
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.