Как указать аргументы запуска для контейнера docker, работающего в kubernetes

#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: переопределяет файл Dockerfile ENTRYPOINT , args: заменяет CMD ). Как вы подтверждаете, что аргументы не обрабатываются? Это image: test предполагает какую-то среду разработчика; как вы там обновляете изображение?

2. Я просто использовал test в качестве переменной для своего пути к изображению здесь. Я развертываю свой образ в обычном кластере kubernetes для целей тестирования. В журналах контейнеров я вижу, что мой скрипт запрашивает у меня, что -b требуется аргумент, а это означает, что bar значение не использовалось для заполнения -b аргумента.

Ответ №1:

Я действительно заставил его работать, используя следующий синтаксис yaml:

 args: 
- "-e"
- "foo"
- "-b"
- "bar" 
 

Синтаксис массива, который я использовал ранее, похоже, вообще не работает, так как все было передано в аргумент-e моего скрипта следующим образом:

 -e " foo -b bar"
 

Вот почему -b аргумент был помечен как отсутствующий, хотя аргументы были заполнены в контейнере.