#docker #kubernetes
Вопрос:
Я как бы застрял с запуском контейнера docker как части задания kubernetes и указанием аргументов времени выполнения в шаблоне задания.
Мой файл Dockerfile указывает точку входа и не содержит директивы CMD:
ENTRYPOINT ["python", "script.py"]
Насколько я понимаю, это означает, что при запуске образа docker и указании аргументов контейнер будет запускаться с использованием точки входа, указанной в файле Dockerfile, и передавать ему аргументы. Я могу подтвердить, что это действительно работает, потому что запуск контейнера с помощью docker делает свое дело:
docker run --rm image -e foo -b bar
В моем случае это начнется script.py, который использует анализатор аргументов для анализа именованных аргументов с предполагаемыми аргументами.
Проблема начинает возникать, когда я использую задание kubernetes, чтобы сделать то же самое:
apiVersion: batch/v1
kind: Job
metadata:
name: pipeline
spec:
template:
spec:
containers:
- name: pipeline
image: test
args: ["-e", "foo", "-b", "bar"]
В модуле, который будет развернут, будет запущена правильная точка входа, но указанные аргументы исчезнут. Я также попытался указать аргументы следующим образом:
args: ["-e foo", "-b bar"]
Но и это не помогло. Я не знаю, почему это не работает, потому что в документации четко указано: «Если вы предоставляете только аргументы для контейнера, точка входа по умолчанию, определенная в образе Docker, запускается с указанными вами аргументами».. Точка входа по умолчанию запущена, это правильно, но аргументы между kubernetes и docker теряются.
Кто — нибудь знает, что я делаю не так?
Комментарии:
1. Ваша первая форма выглядит как правильный синтаксис (Kubernetes
command:
переопределяет файл DockerfileENTRYPOINT
,args:
заменяетCMD
). Как вы подтверждаете, что аргументы не обрабатываются? Этоimage: test
предполагает какую-то среду разработчика; как вы там обновляете изображение?2. Я просто использовал test в качестве переменной для своего пути к изображению здесь. Я развертываю свой образ в обычном кластере kubernetes для целей тестирования. В журналах контейнеров я вижу, что мой скрипт запрашивает у меня, что
-b
требуется аргумент, а это означает, чтоbar
значение не использовалось для заполнения-b
аргумента.
Ответ №1:
Я действительно заставил его работать, используя следующий синтаксис yaml:
args:
- "-e"
- "foo"
- "-b"
- "bar"
Синтаксис массива, который я использовал ранее, похоже, вообще не работает, так как все было передано в аргумент-e моего скрипта следующим образом:
-e " foo -b bar"
Вот почему -b
аргумент был помечен как отсутствующий, хотя аргументы были заполнены в контейнере.