首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IndentationError:由Python3引发的意外缩进。Pod部署YAML中Kubernetes args条目中使用的代码

IndentationError:由Python3引发的意外缩进。Pod部署YAML中Kubernetes args条目中使用的代码
EN

Stack Overflow用户
提问于 2019-04-01 16:00:13
回答 1查看 657关注 0票数 1

目标和问题

拥有可以持续运行的容器/Pod部署。容器应该执行的命令是:/usr/local/bin/python3,命令的args是:"-c $'import time\\nwhile (True):\\n print(\".\");time.sleep(5);'"。但是,当我执行kubectl apply -f "PATH_TO_THE_KUBERNETES_YAML_FILE"时,除了这个Python:IndentationError: unexpected indent之外,部署就会出错。

错误的截图:

Pod部署被用作调用Python代码的媒介,这些代码在使用证书时作为任务的一部分与LetsEncrypt Certbot客户端交互。

请参阅项目这里

因此,应该可以将Pod >> do kubectl exec ...部署到作为Kubernetes部署的一部分运行的容器中。

试过:

定义Kubernetes命令args行的各种方法。

  1. 通过exec选项。例如:python3 -c exec(\"import time\nwhile True: print(\".\");time.sleep(5);\")
  2. 将代码封装在"的不同组合中执行。
  3. $'textwrap.dedent("""import time while True: print(".") time.sleep(5)""")'...
  4. 尝试使用: -c$‘导入时间\n当(真):\n打印(\“.\”);time.sleep(5);’“ 作为args: ["-c $'import time\\nwhile (True):\\n print(\".\");time.sleep(5);'"]的替代方案
  5. 确认Python代码本身工作。
  6. 直接使用Python3 -c "..."并通过docker run命令从这个Dockerfile到容器调用它
  7. 我做过通常的谷歌搜索,Stack*搜索等等。我还在官方的Kubernetes GitHub回购页面上搜索过那里的问题。开着也关着。我没有看到任何与此相匹配的问题。
  8. Kubectl在执行...apply -f YAML_FILE时不会抱怨YAML文件的格式和Pod部署规范的遵守情况。
  9. 尝试使用一些bash代码来代替:["/bin/bash", "-ecx", "while :; do printf '.'; sleep 5 ; done"]<--这是可行的。

进一步信息

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

它似乎是在Kubernetes Pod部署YAML文件中指定Python代码的组合。这与Pythons对重要空格和缩进的要求不太一致。正如您可以在“尝试”部分中看到的那样,它在直接调用Python或通过Docker /exec命令时工作。

我如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2019-04-09 06:23:35

所以我在库伯内特斯斯拉克频道上得到了帮助。这是YAML语法问题。

Pod部署YAML文件中的以下内容解决了这个问题

代码语言:javascript
运行
复制
  args:
    - |-
      -c
      import time
      while True:
          print('.')
          time.sleep(5)

这和Dockerfile的.

代码语言:javascript
运行
复制
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部署重新使用.但是,Dockerfile的CMD被Pod部署YAML文件中的args属性覆盖。

详细解释了args属性。

  • -c是Python二进制文件的一个参数。
  • 其余的是性病。要让容器通过Pod部署部署,Python代码将继续运行,以便它可以处于备用状态,以便通过kubectl exec对其进行命令调用

关键

args属性的这一部分> - |-。它剥离行馈送和任何尾随的空行。使声明多行Python代码块成为可能。

文档

@wizzwizz4 4,@a_guest,以获得您的评论和建议。他们帮助我解决这个问题,缩小了解决方案的范围。同时也非常感谢Kubernetes Slack频道的@grampelberg先生帮助我并提供了解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55463094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档