Аргументы контейнера Kubernetes ведут себя некорректно

#docker #kubernetes #postman #args #newman

#docker #kubernetes #почтальон #аргументы #ньюман

Вопрос:

Я хочу использовать Kubernetes и postman/newman образ Docker для выполнения моих тестов API.

Локально я могу выполнить изображение с помощью

docker запускает postman/newman запуск <url-to-collection> —env-var baseUrl=<local-hostname>

Я включаю изображение в файл манифеста Kubernetes

 spec:
  containers:
    - name: newman
      image: postman/newman:latest
      args:
        - run
        - '<url-to-collection>'
        - --env-var baseUrl=<kubernetes-hostname>
 

Когда я применяю манифест и просматриваю журналы контейнера, я получаю следующую ошибку:

error: unknown option '--global-var baseUrl=<kubernetes-hostname>'

Я пробовал много вещей с кавычками и использованием command раздела вместо args раздела, но всегда с тем же результатом. Я полагаю, что Kubernetes каким-то образом создает команду таким образом, что newman исполняемый файл не может ее понять. Однако я не смог найти никакой информации об этом.

(Я также создал проблему в репозитории Newman на GitHub здесь)

Может ли кто-нибудь объяснить мне, откуда эта проблема и как я могу ее решить?

В любом случае спасибо!

Ответ №1:

Команды Linux состоят из последовательности слов. Если вы вводите команду в командной строке, она берет на себя ответственность за разбиение ее на слова для вас, но в списке Kubernetes args: вам нужно разделить слова самостоятельно.

 args:
  - run
  - '<url-to-collection>'
  # You want these as two separate arguments, so they need to be
  # two separate list items
  - --env-var
  - baseUrl=<kubernetes-hostname>
 

Если два аргумента находятся в одном элементе списка, они представляют собой одно «слово»:

 # /bin/ls "/app/some directory/some file"
command:
  - /bin/ls
  # a single argument, including embedded spaces
  - /app/some directory/some file
 

Те же основные правила применяются для Docker Compose entrypoint: и command: для файла и директив Dockerfile и JSON-синтаксиса ENTRYPOINT CMD , за исключением того, что все собственные формы Docker также принимают простую строку, которую они будут разбивать на пробелы (используя оболочку в случае Dockerfile, но не в случае Compose ).

В docker run предоставленной вами команде оболочка вашей хост-системы сначала обрабатывает ее, поэтому --env-var параметр и baseUrl=... аргумент разделяются на отдельные слова, прежде чем они будут переданы в контейнер.

Комментарии:

1. Спасибо за объяснение, это действительно решило проблему. Мне также пришлось удалить кавычки вокруг URL-адреса, которые требуются при запуске команды из командной оболочки. Теперь это работает как шарм.