Ошибка скрипта контейнера в Apt “Get: команда не найдена” и “Чтение: команда не найдена”

Вопрос или проблема

Я собираю базовый сценарий хаоса для личного проекта и сталкиваюсь с странной ошибкой в контейнере cronjob Kubernetes, но мне трудно изолировать её.

Конфигурационная карта Kubernetes, содержащая сценарий:

apiVersion: v1
kind: ConfigMap
metadata:
  name: chaos-script
data:
  chaos-script.sh: |
    #!/bin/bash
    BASE_URL="https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}/api/v1/namespaces/foo"

    echo "$0: ищу/устанавливаю curl..."
    stat /usr/bin/curl 2>/dev/null || $(apt-get update && apt-get install -y curl)
    echo "$0: ищу/устанавливаю jq..."
    stat /usr/bin/jq 2>/dev/null || $(apt-get install -y jq)
    echo "$0: завершил поиск/установку пакетов"
    ...

Вывод:

/scripts/chaos-script.sh: ищу/устанавливаю curl...
debconf: задержка конфигурации пакета, так как apt-utils не установлен
/scripts/chaos-script.sh: line 5: Get:1: команда не найдена
/scripts/chaos-script.sh: ищу/устанавливаю jq...
debconf: задержка конфигурации пакета, так как apt-utils не установлен
/scripts/chaos-script.sh: line 7: Reading: команда не найдена
/scripts/chaos-script.sh: завершил поиск/установку пакетов
...

Сообщения “Get:1: команда не найдена” и “Reading: команда не найдена” похоже исходят от Apt, если я выполняю set -x, я получаю:

/scripts/chaos-script.sh: ищу/устанавливаю curl...
++ apt-get update
++ apt-get install -y curl
debconf: задержка конфигурации пакета, так как apt-utils не установлен
+ Get:1 http://archive.ubuntu.com/ubuntu noble InRelease '[256' 'kB]' Get:2 http://security...
/scripts/chaos-script.sh: line 5: Get:1: команда не найдена

и

/scripts/chaos-script.sh: ищу/устанавливаю jq...
++ apt-get install -y jq
debconf: задержка конфигурации пакета, так как apt-utils не установлен
+ Reading package lists... Building dependency tree... Reading state information... Следующие дополнительные пакеты будут установлены...
/scripts/chaos-script.sh: line 7: Reading: команда не найдена

Все, похоже, работает нормально, так что это скорее любопытство, но кто-нибудь знает, что делать, чтобы устранить эти ошибки?

Ответ или решение

Ошибка скрипта контейнера в Apt: "Get: команда не найдена" и "Reading: команда не найдена"

В ходе разработки личного проекта в области хаоса, вы столкнулись с ошибками при выполнении Kubernetes cronjob контейнера, которые проявляются в виде сообщений об ошибках: "Get: команда не найдена" и "Reading: команда не найдена". Давайте подробнее разберем причины возникновения этих ошибок и предложим способы их устранения.

Анализ проблемы

Согласно приведенному вами коду скрипта, он предполагает наличие предустановленных утилит curl и jq, после чего выполняет их установку при отсутствии. Ошибка возникает из-за того, что вывод команды apt-get update и apt-get install рассматривается как попытка выполнить их как команды в shell, в результате чего интерпретатор Bash пытается выполнить строки с такими командами, как "Get:1" или "Reading", что и приводит к ошибкам.

Причины ошибок

  1. Необработанный вывод команд: Когда вы запускаете apt-get, вывод этих команд отправляется в стандартный вывод, а не в стандартный ошибочный вывод или файл. Таким образом, когда вывод содержит строки, начинающиеся с "Get:" или "Reading:", они воспринимаются как команды для выполнения, что и порождает сообщения об ошибках.

  2. Отсутствие apt-utils: Одним из предупреждений в выводе является сообщение о том, что apt-utils не установлен. Это может влиять на поведение apt и приводит к потерям в информации о прогрессе установки.

Рекомендации по устранению

  1. Перенаправление вывода: Чтобы избежать выполнения строк, содержащих информацию о прогрессе, вы можете перенаправить стандартный вывод команд apt-get в /dev/null, добавив > /dev/null в конце команд:

    apt-get update > /dev/null && apt-get install -y curl > /dev/null
  2. Установка apt-utils: Рекомендуется добавить установку apt-utils в скрипт. Это поможет улучшить обработку операций инсталляции и может предотвратить предупреждения:

    stat /usr/bin/curl 2>/dev/null || $(apt-get update && apt-get install -y apt-utils curl)
  3. Использование set +e: Если вам неважно, чтобы скрипт прекращал выполнение в случае ошибки, вы можете использовать set +e. Однако, это не рекомендуется, так как может привести к игнорированию других критически важных ошибок.

Заключение

Хотя ошибки "Get: команда не найдена" и "Reading: команда не найдена" не критичны для выполнения вашей программы, их устранение улучшит восприятие выходных данных и облегчит дальнейшую диагностику. Следуя предложенным рекомендациям, вы сможете избежать подобного поведения и повысить устойчивость вашего сценария в Kubernetes. Если у вас есть дополнительные вопросы или требуется помощь, пожалуйста, не стесняйтесь обращаться за разъяснением.

Оцените материал
Добавить комментарий

Капча загружается...