在 Kubernetes yaml 文件中,如何先 运行 一个 python 脚本然后 运行 指定的容器?

In a Kubernetes yaml file, how do you run a python script first then run the specified container?

我 运行 遇到一个问题,似乎我只能在 dockerfile 或 Kubernetes 中 运行 python 命令。现在我有两个 python 脚本,第一个脚本设置密钥和令牌,因此第二个脚本可以 运行 正确。

我的 dockerfile 看起来像这样:

FROM python:3.8.0-alpine
WORKDIR /code
COPY script1.py .
COPY script2.py .

# Install python libraries
RUN pip install --upgrade pip
RUN apk add build-base
RUN apk add linux-headers
RUN pip install -r requirements.txt

CMD [ "python", "-u", "script2.py"]

我的 Kubernetes yaml 文件是:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: script2
  labels:
    app: script2-app
spec:
  selector:
    matchLabels:
      app: script2-app
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: script2-app
    spec:
      containers:
      - name: script2-app
        image: script2:v1.0.1
        ports:
          - containerPort: 5000
        env:
          - name: KEYS_AND_TOKENS
            valueFrom:
              secretKeyRef:
                name: my_secret
                key: KEYS_AND_TOKENS
        command:
          - "python"
          - "script1.py"

问题始于 yaml 文件中的 'command' 部分。没有它,Kubernetes 将像往常一样 运行 容器。 (容器仍然可以 运行 没有密钥和令牌。它只会记录一些函数失败 运行 然后继续。)但是,当我包含 'command' 部分时,script1 将运行 并成功设置密钥。但是一旦 script1 完成,就没有其他事情发生了。部署继续 运行 但 script2 从未启动。

我这样做的原因是因为 script2 有时可能需要重新启动,因为互联网连接失败导致它崩溃。因为所有 script1 所做的都是设置密钥和令牌,它只需要 运行 一次,然后只要 pod 存在,就会设置这些东西。我不想在每次 script2 重新启动时都验证密钥和令牌。这就是为什么这两个脚本是分开的,也是为什么我在启动时只 运行ning script1。

如有任何帮助,我们将不胜感激!

发生了什么事?

通过yaml文件提供的命令会覆盖dockerfile中的CMD(可以参考kubernetes文档here)。因此,当您在 yaml 文件中提供用于执行 script1 的命令时,它会覆盖 dockerfile 中用于执行 script2 的命令 (CMD),因此您必须根据代码逻辑得到错误。

如何解决?

第一步:创建一个bash文件如下:(命名为“run.sh”)

#!/bin/bash

exec python3 /path/to/script1.py
exec python3 /path/to/script2.py

第 2 步:将 dockerfile 更新为:

FROM python:3.8.0-alpine
WORKDIR /code
COPY script1.py .
COPY script2.py .
COPY run.sh . # copying the bash file

# Install python libraries
RUN pip install --upgrade pip
RUN apk add build-base
RUN apk add linux-headers
RUN pip install -r requirements.txt

RUN chmod a+x run.sh # making it executable
CMD ["./run.sh"] # executing the scripts through bash file

第 3 步:从 kubernetes 部署 yaml 中删除命令

但是如果你想将命令保留在 yaml 文件中,那么你应该将其替换为 "./run.sh"

注: 理想情况下,您应该 而不是 运行 像这样的两个不同的脚本。如果您需要设置 tokens/keys ,您应该在您可以在主脚本中调用的子模块中进行设置。您可以通过异常处理和重试机制的组合来处理网络连接问题等。