#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