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

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

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

docker run postman / newman run ‹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 не может ее понять. Однако я не смог найти никакой информации об этом.

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

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

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


person Simon    schedule 20.01.2021    source источник


Ответы (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 ENTRYPOINT и CMD с синтаксисом JSON, за исключением того, что все собственные формы Docker также принимают простую строку, которую они будут разбивать на пробелы (используя оболочку в случае Dockerfile, но не в случае Compose).

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

person David Maze    schedule 21.01.2021
comment
Спасибо за объяснение, это действительно решило проблему. Мне также пришлось удалить кавычки вокруг URL-адреса, которые требуются, когда я запускаю команду из оболочки. Теперь это работает как шарм. - person Simon; 21.01.2021