কুবারনেটসের সাথে এক ইয়ামল ফাইলে একাধিক কমান্ড কীভাবে সেট করবেন?


96

এই অফিসিয়াল ডকুমেন্টে এটি একটি ইয়ামল কনফিগারেশন ফাইলে কমান্ড চালাতে পারে:

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}\""]

আমি যদি একাধিক কমান্ড চালাতে চাই তবে কীভাবে করব?

উত্তর:


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

ব্যাখ্যা:command ["/bin/sh", "-c"] বলেন, "একটি শেল চালানোর জন্য, এবং নিম্নলিখিত নির্দেশাবলী চালানো"। এরপরে আরোগুলি শেলের কমান্ড হিসাবে প্রেরণ করা হয়। শেল স্ক্রিপ্টিংয়ে একটি সেমিকোলন কমান্ড পৃথক করে এবং &&প্রথম সফল হলে শর্তাধীনভাবে নিম্নলিখিত কমান্ডটি চালায়। উপরের উদাহরণে এটি সর্বদা command oneঅনুসরণ করে command twoচলে এবং সফল command threeহলে কেবল চালিত হয় command two

বিকল্প: অনেক ক্ষেত্রে আপনি চালাতে চান এমন কয়েকটি কমান্ড সম্ভবত চালানোর জন্য চূড়ান্ত কমান্ডটি সেটআপ করছে। এই ক্ষেত্রে, আপনার নিজের ডকফরফিল তৈরি করার উপায়। এ চালান বিশেষ করে নির্দেশ।


4
হ্যাঁ, খুব বৈধ, তবে আমি মনে করি commandডকফাইফিলকে ওভার্রাইড করার সাথে সাথে এর ব্যবহারের জন্য আরও ভাল ব্যবহারের ঘটনা রয়েছে Entrypoint;)
মাইকেল হাউসনব্লাস

4
ধারক জীবনচক্র দিয়ে এটি কীভাবে করবেন সে সম্পর্কে কোনও ধারণা? এটির কোনও
অর্গ

4
@ এক্লোকে আপনি আর্গুমেন্টগুলি অতিরিক্ত কমান্ড স্ট্রিং হিসাবে নির্দিষ্ট করতে পারবেন। কনটেইনারটিতে কমান্ড এবং আরগগুলির মধ্যে পৃথকীকরণ কেবল আর্গুমেন্টগুলিকে ওভাররাইড করা আরও সহজ করে তোলা। তারা কার্যত সমতুল্য।
টিম অ্যালক্লেয়ার

এখানে কি আছে?
আব্দুল

4
@ আবদুল এর অর্থ একটি ইন্টারেক্টিভ শেল শুরু করা বা কোনও ফাইল থেকে স্ক্রিপ্ট লোড করার চেয়ে আর্গুমেন্ট হিসাবে সরবরাহ করা স্ক্রিপ্টটি চালানো।
টিম অ্যালক্লেয়ার

77

আমার অগ্রাধিকারটিটি অর্গগুলি মাল্টলাইন করা, এটি পড়া সহজ এবং সহজ। এছাড়াও, চিত্রটিকে প্রভাবিত না করে স্ক্রিপ্টটি পরিবর্তন করা যেতে পারে, কেবল শুঁটি পুনরায় চালু করা দরকার। উদাহরণস্বরূপ, একটি মাইএসকিএল ডাম্পের জন্য, ধারক বৈশিষ্টটি এই জাতীয় কিছু হতে পারে:

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:
      - ...

এটির কারণটি হ'ল ইয়ামল আসলে "-" এর পরে সমস্ত লাইন এক হয়ে যায় এবং sh একটি দীর্ঘ স্ট্রিং চালায় "প্রতিধ্বনি শুরু; ls ...; প্রতিধ্বনি;";


দুর্দান্ত, তবে আপনি যখন কুবেক্টেল দিয়ে কোনও সম্পাদনা করার অনুরোধ করবেন তখন এটি আবার এক লাইনে থাকবে। :)
সেক্রেট

@ সেক্রেট ওহ না! :(
অ্যাক্লোকে

4
এটি বেশ সুন্দরভাবে কাজ করেছে - কীটি প্রতিটি লাইনের অর্ধিকোলন। কমান্ডগুলি অনেকগুলি হ'ল এটি একটি বিশেষত ভাল সমাধান এবং উপরের সমাধানটির সাথে একাধিকতর হবে।
গিটকে

এই আমি খুঁজছিলাম ছিল। এই সমাধানটি যুক্তি হিসাবে পরিবেশের পরিবর্তনশীলটি সুন্দরভাবে কাজ করে।
জিঙ্গপেং উ

+1 সুন্দরী, প্লাস মাল্টি-লাইন কমান্ডগুলি পুরোপুরি command: ['/bin/bash', '-c'] args: - exec &> /path/to/redirected/program.output;কার্যকরভাবে কাজ করে: `পাইথন / প্রোগ্রাম.পি`` --key1 = ভাল1` key --key2 = ভাল2` key --key3 = ভাল 3`
নেলসনস্প্রব

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

4
খুব দুর্দান্ত, তবে আমি মনে করি স্ক্রিপ্টটি ইনলাইন করা সহজ, কেবল মাল্টলাইন সিনট্যাক্স ব্যবহার করুন। আমি এটি একটি পৃথক উত্তরে দেখায়।
অলিভার

আমার যখন ডাবল কোট পাস করতে হবে তখন কী হবে। উদাহরণস্বরূপ এই কমান্ডটি কল্পনা করুন: প্রিন্টফ '% s @% s% n' "$ (প্রতিধ্বনি 'ব্যবহারকারী')" "$ (ইকো 'হোস্ট')"
L3K0V

16

আপনি যদি একটি কমান্ডের সাথে সমস্ত কমান্ডকে একত্রীকরণে এড়াতে চান ;বা &&আপনি হেরডোক ব্যবহার করে সত্য মাল্টি-লাইন স্ক্রিপ্ট পেতে পারেন:

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

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

   EOF

এটি বিদ্যমান ব্যাশ স্ক্রিপ্টগুলি চালনার জন্য সহজ, তবে হেরডোকটি সেটআপ করার জন্য একটি অভ্যন্তরীণ এবং বাইরের উভয় শেল উদাহরণ প্রয়োজনের ডাউনসাইড রয়েছে।


4

আইএমএইচওর সেরা বিকল্পটি হ'ল ওয়াইএএমএল এর নেটিভ ব্লক স্কেলারগুলি ব্যবহার করা । বিশেষত এই ক্ষেত্রে, ভাঁজ শৈলী ব্লক।

আবাহন করার মাধ্যমে sh -cআপনি কমান্ড হিসাবে আপনার ধারক আর্গুমেন্ট পাস করতে পারেন, কিন্তু আপনি যদি এইরূপ সূচারূভাবে তাদের নতুন লাইন দিয়ে আলাদা করতে চাই, আপনি ব্যবহার করতে চান সেটি গুটান শৈলী ব্লক , তাই YAML অনুসরণকারী শূণ্যস্থান থেকে নতুন লাইন রূপান্তর করতে, কার্যকরীভাবে কমান্ড concatenating জানবে যে।

একটি পরিপূর্ণ কাজের উদাহরণ:

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

আমি জানি যে আমার উদাহরণটি রেডিনেসপ্রব, লাইভনেসপ্রোব ইত্যাদির সাথে সম্পর্কিত তবে সন্দেহ হয় একই ঘটনাটি ধারক কমান্ডের ক্ষেত্রে। এটি নমনীয়তা সরবরাহ করে কারণ এটি ব্যাশে একটি স্ট্যান্ডার্ড স্ক্রিপ্ট লেখার আয়না করে।


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"]

ইয়ামল ফাইল থেকে সম্পূর্ণ পাত্রে অবরুদ্ধ:

    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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.