如何在kubernetes中将`args`作为`command`运行

时间:2019-08-21 09:26:51

标签: docker kubernetes dockerfile docker-entrypoint

我有一个要在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"]

2 个答案:

答案 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会将其作为命令传递。