Команда Kubernetes Helm bash: bash: {«сообщение»:: команда не найдена

#bash #curl #kubernetes #yaml #kubernetes-helm

#bash #curl #kubernetes #yaml #kubernetes-helm

Вопрос:

Я пытаюсь запустить команду curl в моей диаграмме helm, которая запускает лямбда. Если я запускаю свой лямбда-код на локальном хосте и нажимаю на него с помощью curl из командной строки, тогда он работает отлично. Однако, если я разверну лямбда-выражение и попытаюсь использовать его так, как он будет работать на производстве, запустив мою диаграмму helm, она прерывается со следующей ошибкой :

bash: {«сообщение»:: команда не найдена

Вот диаграмма helm, которую я создал:

 apiVersion: batch/v1
kind: Job
metadata:
  name: clean-receiver-list
spec:
  template:
    spec:
      initContainers:
      - name: check-author
        image: "{{ .Values.global.utils.repository }}:{{ .Values.global.utils.imageTag }}"
        imagePullPolicy: {{ .Values.global.utils.pullPolicy }}
        command: ['bash', '-c', 'while [ $(curl -sw "%{http_code}" "http://{{ .Release.Name }}-stuff/healthcheck" -o /dev/null) -ne 200 ]; do sleep 15; done' ]
      containers:
        - name: clean-receiver-list
          image: "{{ .Values.global.utils.repository }}:{{ .Values.global.utils.imageTag }}"
          command: ['bash',  '-c', '$(curl -d {"podNamespace": "{{ .Release.Name }}"} "https://mylambda/runTask")']
      restartPolicy: Never
  backoffLimit: 4
  

Таким образом, это вторая команда curl с моим развернутым лямбдой, которая ломается.

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

1. Вы используете $(...) синтаксис подкоманды для запуска curl , а затем интерпретируете его результаты как команду оболочки. Это то, что вы ожидаете; или вам просто нужно отправить HTTP на этот URL, ожидая возврата тела JSON?

2. Я отправляю сообщение в конечную точку и ожидаю возврата JSON

3. Как предположил Дейв Мейз, синтаксис $() вам не нужен. Также похоже, что у вас проблема с кавычками после curl -d. Первое { нужно будет заключить в кавычки.

Ответ №1:

Вы вызываете команду как

 bash -c $(curl ...)
  

которая запускает curl команду; но поскольку она завернута внутрь $(...) , она принимает ответ от этого и пытается запустить его как команду оболочки. Если URL-адрес, на который вы отправляете, возвращает тело JSON, это приведет к ошибке, очень похожей на то, что вы видите.

Самый простой ответ — удалить команду $(...) вокруг команды:

 command: ['bash',  '-c', 'curl -d {"podNamespace": "{{ .Release.Name }}"} "https://mylambda/runTask"']
  

Однако в этой команде вы не делаете ничего, что на самом деле требует оболочки (расширение переменной среды, подстановка команд, выполнение нескольких команд, …), и пропуск уровня оболочки-оболочки может быть улучшением. В частности, существуют проблемы с цитированием, которых это позволяет избежать (ваша текущая форма выдает ошибку HTTP, потому что оболочка проглатывает двойные кавычки, поэтому текст сообщения не является допустимым JSON?). Я мог бы написать вместо:

 command:
  - curl
  - -d
  # Using YAML "block scalar" syntax to avoid quoting problems
  - >-
      {"podNamespace": "{{ .Release.Name }}"}
  - https://mylambda/runTask