我有一个要在kubernetes作业中运行的python脚本。我已使用configMap
将其上传到位于dir/script.py
中的容器中。
容器在args["load"]
下正常运行。
我尝试在Job
清单中使用postStart生命周期,但它似乎无法运行。
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- /usr/bin/python /opt/config-init/db/tls_generator.py
下面是清单的片段
containers:
- name: {{ template "gluu.name" . }}-load
image: gluufederation/config-init:4.0.0_dev
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- /usr/bin/python /opt/config-init/db/tls_generator.py
volumeMounts:
- mountPath: /opt/config-init/db/
name: {{ template "gluu.name" . }}-config
- mountPath: /opt/config-init/db/generate.json
name: {{ template "gluu.fullname" . }}-mount-gen-file
subPath: generate.json
- mountPath: /opt/config-init/db/tls_generator.py
name: {{ template "gluu.fullname" . }}-tls-script
envFrom:
- configMapRef:
name: {{ template "gluu.fullname" . }}-config-cm
args: [ "load" ]
如何在tls_generator.py
之后运行args["load"]
密码。
dockerFile部分看起来像
ENTRYPOINT ["tini", "-g", "--", "/app/scripts/entrypoint.sh"]
CMD ["--help"]
答案 0 :(得分:0)
您正在使用Container Lifecycle Hooks,更具体地说PreStop
。
由于API请求或管理事件(例如,活动探测失败,抢占,资源争用等)而终止容器之前,将立即调用此挂钩。
如果要在pod
启动时执行命令,则应考虑使用PostStart
。
此挂钩在创建容器后立即执行。但是,不能保证该挂钩将在容器ENTRYPOINT之前执行。没有参数传递给处理程序。
另一个选择是使用Init Containers,下面是一些带有示例的想法:
- 等待使用外壳程序单行命令创建Service,例如:
for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; done; exit 1
- 使用以下命令从向下的API向远程服务器注册此Pod:
curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d >'instance=$(<POD_NAME>)&ip=$(<POD_IP>)'
- 等待一段时间,然后使用类似命令启动应用容器
sleep 60
有关详细信息,请阅读有关如何使用Init containers的文档。
答案 1 :(得分:0)
我的最终目标是在加载命令完成后立即运行tls_generator.py
。这是我随附的,并且运行良好。
command: ["/bin/sh", "-c"]
args: ["tini -g -- /app/scripts/entrypoint.sh load && /usr/bin/python
/scripts/tls_generator.py"]
在这种情况下,运行"tini -g -- /app/scripts/entrypoint.sh"
时的默认命令将是--help
命令。但是添加load
会将其作为命令传递。