IndentationError: неожиданный отступ, созданный Python 3. Код, используемый в записи аргументов Kubernetes в модуле развертывания YAML - PullRequest
1 голос
/ 01 апреля 2019

цель и проблема

Иметь развертывание контейнера / контейнера, которое может работать непрерывно.Команда, которую должен выполнить контейнер: /usr/local/bin/python3 и аргументы команды: "-c $'import time\\nwhile (True):\\n print(\".\");time.sleep(5);'".Однако, когда я выполняю kubectl apply -f "PATH_TO_THE_KUBERNETES_YAML_FILE" ошибки развертывания с этим исключением Python: IndentationError: unexpected indent.

Снимок экрана ошибки: enter image description here

Развертывание Podиспользуется как средство для вызова кода Python, который взаимодействует с клиентом Certbot как часть задач при использовании сертификатов LetsEncrypt.

См. проект здесь

Так что должна быть возможность развернуть Pod >> do kubectl exec ... в контейнере, выполняемом как часть развертывания Kubernetes.

пробный:

Различныйспособы определения командной строки Kubernetes.

  1. С помощью опции exec Python.Например: python3 -c exec(\"import time\nwhile True: print(\".\");time.sleep(5);\")
  2. Включение кода для выполнения с различными комбинациями ` и " .
  3. $'textwrap.dedent("""import time while True: print(".") time.sleep(5)""")' ...
  4. попытался использовать:

    args:
     - "-c $'import time\\nwhile (True):\\n print(\".\");time.sleep(5);'"
    

    в качестве альтернативы args: ["-c $'import time\\nwhile (True):\\n print(\".\");time.sleep(5);'"]

  5. подтвердил, что сам код Python работает.

  6. как при непосредственном использовании Python3 -c "...", так и при вызове его с помощью команды docker run для контейнера из этого Dockerfile
  7. Я выполнил обычный поиск в Google, Stack *и т. д. Я также был на официальной странице репо Kubernetes GitHub и просматривал там вопросы. Закрыто и открыто. И я не видел ни одной проблемы, соответствующей этому.
  8. Kubectl не жалуется при выполнении ...apply -f YAML_FILE относительно формата файла YAML и соответствия спецификации развертывания Pod.
  9. Попробовал вместо этого некоторый код bash: ["/bin/bash", "-ecx", "while :; do printf '.'; sleep 5 ; done"] <-это работает. </li>

дополнительная информация

  • Python v3.7.2
  • Kubernetes is v1.12.5-gke.10

Кажется, это комбинация указания кода Python в YAML-файле развертывания Pod Kubernetes Pod ... который не подходит для Pythonsтребование значительных пробелов и отступов.Как вы можете прочитать в разделе #tried, он работает при вызове Python напрямую или с помощью команды Docker run / exec.

Как я могу устранить эту проблему?

1 Ответ

1 голос
/ 09 апреля 2019

Так что я смог получить помощь по этому вопросу на канале Kubernetes Slack.Это была проблема синтаксиса YAML.

В файле YAML для развертывания Pod это решено следующим образом

  args:
    - |-
      -c
      import time
      while True:
          print('.')
          time.sleep(5)

, это работает в сочетании с Dockerfile ....

FROM larssb/certbot-dns-cloudflare-python3
LABEL author="https://github.com/larssb"

#
# Container config
#
WORKDIR /letsencryptit

#
# COPY IN DATA
#
COPY ./scripts /scripts/
COPY ./letsencryptit /letsencryptit/

#
# INSTALL
#
RUN pip install --upgrade google-api-python-client --disable-pip-version-check --no-cache-dir \
    && pip install --upgrade oauth2client --disable-pip-version-check --no-cache-dir \
    && pip install --upgrade sty --disable-pip-version-check --no-cache-dir \
    && chmod +x /scripts/deploy-hook-runner.sh

# Set an ENTRYPOINT to override the entrypoint specified in certbot/certbot
ENTRYPOINT ["/usr/local/bin/python3"]
CMD ["-c"]

ENTRYPOINT, какэто повторно используется при развертывании Pod.Однако CMD файла Dockerfile перезаписывается свойством args в файле YAML развертывания Pod.

Подробно объяснено свойство args

  • -c является параметромв двоичный файл Python
  • Остальное - стандартный.Код Python, для которого контейнер, развернутый через развертывание Pod, непрерывно запускается, чтобы он мог быть в режиме ожидания для командных вызовов к нему через kubectl exec

Ключ

Thisчасть имущества args> - |-.Он удаляет перевод строки и любые конечные пустые строки.Возможность создания многострочного блока кода Python

Документация


Слава @ wizzwizz4, @a_guest для вашегокомментарии и предложения.Они помогли мне разобраться с этим, сузить решение.Также большое спасибо г-ну @grampelberg на канале Kubernetes Slack за помощь и решение.

...