Dalam dokumen resmi ini, ini dapat menjalankan perintah di file konfigurasi yaml:
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}\""]
Jika saya ingin menjalankan lebih dari satu perintah, gimana caranya?
sumber
command
karena menimpa DockerfileEntrypoint
;)Preferensi saya adalah multiline args, ini paling sederhana dan termudah untuk dibaca. Selain itu, skrip dapat diubah tanpa memengaruhi gambar, hanya perlu memulai ulang pod. Misalnya, untuk mysql dump, spesifikasi containernya bisa seperti ini:
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: - ...
Alasan ini bekerja adalah karena yaml sebenarnya menggabungkan semua baris setelah "-" menjadi satu, dan sh menjalankan satu string panjang "echo starting; ls ...; echo done;".
sumber
command: ['/bin/bash', '-c']
args:
- exec &> /path/to/redirected/program.output;
`python / program.py`` --key1 = val1` `--key2 = val2`` --key3 = val3`Jika Anda ingin menggunakan Volume dan ConfigMap, Anda dapat memasang data ConfigMap sebagai skrip, lalu menjalankan skrip tersebut:
--- 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
Ini sedikit membersihkan spesifikasi pod Anda dan memungkinkan pembuatan skrip yang lebih kompleks.
$ kubectl logs my-pod Do this Do that
sumber
Jika Anda ingin menghindari menggabungkan semua perintah menjadi satu perintah dengan
;
atau&&
Anda juga bisa mendapatkan skrip multi-baris yang sebenarnya menggunakan heredoc:command: - sh - "-c" - | /bin/bash <<'EOF' # Normal script content possible here echo "Hello world" ls -l exit 123 EOF
Ini berguna untuk menjalankan skrip bash yang ada, tetapi memiliki sisi negatif karena membutuhkan instans inner dan outer shell untuk menyiapkan heredoc.
sumber
IMHO pilihan terbaik adalah menggunakan skalar blok asli YAML . Khususnya dalam hal ini, yang terlipat blok gaya .
Dengan memanggil,
sh -c
Anda dapat meneruskan argumen ke penampung Anda sebagai perintah, tetapi jika Anda ingin memisahkannya dengan baris baru secara elegan, Anda ingin menggunakan blok gaya lipat , sehingga YAML tahu cara mengonversi baris baru menjadi spasi putih, secara efektif menggabungkan perintah.Contoh kerja lengkap:
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
sumber
Saya tidak yakin apakah pertanyaannya masih aktif tetapi karena saya tidak menemukan solusi dalam jawaban di atas, saya memutuskan untuk menuliskannya.
Saya menggunakan pendekatan berikut:
readinessProbe: exec: command: - sh - -c - | command1 command2 && command3
Saya tahu contoh saya terkait dengan readinessProbe, livenessProbe, dll. Tetapi mencurigai kasus yang sama untuk perintah container. Ini memberikan fleksibilitas karena mencerminkan penulisan skrip standar di Bash.
sumber
Berikut adalah bagaimana Anda bisa melewatkan, beberapa perintah & argumen dalam satu file YAML dengan kubernetes:
# 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"]
Blok kontainer penuh dari file 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
sumber
Hanya untuk membawa opsi lain yang memungkinkan, rahasia dapat digunakan saat mereka disajikan ke dalam pod sebagai volume:
Contoh rahasia:
apiVersion: v1 kind: Secret metadata: name: secret-script type: Opaque data: script_text: <<your script in b64>>
Ekstrak Yaml:
.... 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
Saya tahu banyak yang akan berpendapat bahwa ini bukanlah untuk apa rahasia harus digunakan, tetapi ini adalah pilihan.
sumber
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
sumber