#kubernetes #kubectl #kubernetes-jobs
Вопрос:
Я готовлюсь к экзамену CKAD и занимаюсь практикой с вопросами, представленными здесь
У меня есть сомнения по поводу этих двух разных способов выполнения команд. Здесь приведен пример с заданием, но я думаю, что вопрос может быть более общим и расширяемым для всех контейнеров.
В разделе «Задания» есть два запроса:
kubectl create job pi --image=perl -- perl -Mbignum=bpi -wle 'print bpi(2000)'
kubectl create job busybox --image=busybox -- /bin/sh -c 'echo hello;sleep 30;echo world'
Почему во второй команде мне также нужно указать /bin/sh-c?
Как я мог понять, когда его использовать, а когда нет?
Комментарии:
1. Вы используете
;
, который является не аргументомecho
, а разделителем, анализируемым оболочкой, поэтому вам нужна оболочка для его анализа и выполнения. В противном случае вы бы работалиecho
с аргументамиhello;sleep
и30;echo
иworld
, что, скорее всего, не то, что вы хотите.2. Большое вам спасибо за ответ, не хотели бы вы добавить его в качестве ответа, чтобы я мог его принять?
Ответ №1:
Потому что в первом примере
kubectl create job pi --image=perl -- perl -Mbignum=bpi -wle 'print bpi(2000)'
вы вызываете perl
переводчика, perl -Mbignum=bpi -wle 'print bpi(2000)'
и во втором примере вы вызываете команду оболочки bash, echo hello;sleep 30;echo world
поэтому /bin/sh -c
kubectl create job busybox --image=busybox -- /bin/sh -c 'echo hello;sleep 30;echo world'
Говорится --
, что после этого внутри контейнера выполняется команда.
Комментарии:
1. Спасибо за ответ, я хотел спросить вас еще кое о чем, если это возможно. Если команда является чем-то более простым, например»sleep 3600″, нужно ли мне указывать»/bin/sh-c» до или просто «sleep 3600» в разделе команд (конечно, с правильным синтаксисом [«sleep», «3600»] будет работать нормально?
2.Вы могли бы заглянуть внутрь контейнера, но я предполагаю, что
/bin/sh
это будет просто символическая ссылка/bin/bash
. Пример:$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 Jun 1 2020 /bin/sh -> bash
$ readlink -f /bin/sh
/usr/bin/bash
Так/bin/sh
что на самом деле это просто абстракция для вашей текущей оболочки. Будьте осторожны, это также может бытьzsh
илиash
и т. Д. Поэтому, если вы хотите, чтобы эта команда была выполнена с вашей текущей настроенной оболочкой, используйте/bin/sh -c "<command>"
. Если вы выполнили толькоsleep 3600
это, возможно, что в некоторых контейнерах оболочка не настроена,PATH
поэтому она может закончиться ошибкой.