1

我有一个要在 kubernetes 作业中运行的 python 脚本。我已经使用 aconfigMap将其上传到位于例如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.pyargs["load"].

dockerFile 部分看起来像

ENTRYPOINT ["tini", "-g", "--", "/app/scripts/entrypoint.sh"]
CMD ["--help"]
4

2 回答 2

0

您正在使用Container Lifecycle Hooks,更具体地说PreStop

在容器因 API 请求或管理事件(例如活动探测失败、抢占、资源争用等)而终止之前立即调用此钩子。

如果要在pod启动时执行命令,则应考虑使用PostStart.

这个钩子在容器创建后立即执行。但是,不能保证钩子会在容器 ENTRYPOINT 之前执行。没有参数传递给处理程序。

另一种选择是使用Init Containers,这里有一些想法和例子:

 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 容器的文档以获取更多详细信息。

于 2019-08-21T10:57:01.163 回答
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将其作为命令传递。

于 2019-08-21T16:16:34.443 回答