在 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 ,您应该在您可以在主脚本中调用的子模块中进行设置。您可以通过异常处理和重试机制的组合来处理网络连接问题等。
我 运行 遇到一个问题,似乎我只能在 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 ,您应该在您可以在主脚本中调用的子模块中进行设置。您可以通过异常处理和重试机制的组合来处理网络连接问题等。