【问题标题】:Run terminal commands within deployment file在部署文件中运行终端命令
【发布时间】:2020-11-09 16:32:41
【问题描述】:

我想运行一个名为 rstudio 包管理器的应用程序。它有一些终端命令要在部署后运行。有没有办法在部署文件中添加这些命令?我尝试过这种方式,但我遇到了 crashloopback 错误。我对编写部署文件完全陌生。我做错了什么或弄乱了语法吗?

apiVersion: apps/v1 
kind: Deployment
metadata:
  name: rspm-deployment
spec:
  selector:
    matchLabels:
      app: rspm
  replicas: 1 
  template:
    metadata:
      labels:
        app: rspm
    spec:
      nodeSelector:
        kubernetes.io/hostname: nckaoepekin.local
      containers:
      - env:
        - name: RSPM_LICENSE
          value: my_license_key
        image: rstudio/rstudio-package-manager:latest
        name: rstudio-package-manager
        command: ["/bin/sh"]
        args: ["-c", "alias rspm='/opt/rstudio-pm/bin/rspm'; rspm create repo --name=prod-cran --description='Access CRAN packages'; rspm subscribe --repo=prod-cran --source=cran; rspm sync"]
        ports:
        - containerPort: 4242
        resources: {}
        securityContext:
          privileged: true
      restartPolicy: Always
status: {}

---
kind: Service
apiVersion: v1
metadata:
  name: rstudio-pm
spec:
  selector:
    app: rspm
  ports:
  - protocol: TCP
    port: 4242
    targetPort: 4242
    nodePort: 31010
  type: NodePort

我想添加这些终端命令(上面也指定)

alias rspm='/opt/rstudio-pm/bin/rspm'
rspm create repo --name=prod-cran --description='Access CRAN packages'
rspm subscribe --repo=prod-cran --source=cran
rspm sync

当我删除指定的命令和参数时,部署文件正在工作。但是当我添加命令和参数时,我得到了 crashloopback 错误。任何线索将不胜感激。谢谢

【问题讨论】:

  • 这些命令需要在容器开始运行后运行吗?
  • 是的,没错。这些命令需要在 pod 运行 @tarunkhosla 之后执行。我总是可以进入 pod 并运行这些命令。但是还有其他方法可以自动执行这些步骤吗?
  • 还检查 pod 状态为 CrashLoopBackoff 之前的日志,这将显示丢失的内容或无法识别的命令。
  • kubernetes.io/docs/tasks/configure-pod-container/… 尝试使用上面链接中的 postHandler。 @悉达多
  • 是的,可以应用到容器上。

标签: linux docker kubernetes deployment


【解决方案1】:

你可以使用 poststart 钩子here

lifecycle:
  postStart:
    exec:
      command:
        - "sh"
        - "-c"
        - |
          alias rspm='/opt/rstudio-pm/bin/rspm' &&
          rspm create repo --name=prod-cran --description='Access CRAN packages'&&
          rspm subscribe --repo=prod-cran --source=cran &&
          rspm sync

【讨论】:

【解决方案2】:

我在所有 bash 命令之后添加了睡眠,因为这些文件需要时间来执行。

            exec:
              command:
                - "sh"
                - "-c"
                - |
                  alias rspm='/opt/rstudio-pm/bin/rspm' &&
                  sleep 5 &&
                  rspm create repo --name=prod-cran --description='Access CRAN packages' &&
                  sleep 5 &&
                  rspm subscribe --repo=prod-cran --source=cran &&
                  sleep 5 &&
                  rspm sync

它成功了!

【讨论】:

    【解决方案3】:

    尝试使用postStart容器生命周期事件显示here

    编辑

    1. 在容器映像中创建和存储文件
    cat > postStart.sh <<
    alias rspm='/opt/rstudio-pm/bin/rspm'
    rspm create repo --name=prod-cran --description='Access CRAN packages'
    rspm subscribe --repo=prod-cran --source=cran
    rspm sync
    EOF
    
    1. 尝试运行 postStart 挂钩,如下所示
        lifecycle:
          postStart:
            exec:
              command:
                - /bin/bash
                - postStart.sh
    

    【讨论】:

    • 感谢您的回复。我试过了,我得到了错误。这是我的 postStart 的样子--> 生命周期: postStart: exec: command: ["/bin/sh", "-c", "alias rspm='/opt/rstudio-pm/bin/rspm'; rspm create repo --name=prod-cran --description='Access CRAN packages'; rspm subscribe --repo=prod-cran --source=cran; rspm sync"] 我收到这个错误 PostStartHookError: command 'sh -c alias rspm='/opt/rstudio-pm/bin/rspm' rspm create repo --name=prod-cran --description='Access CRAN packages' rspm subscribe --repo=prod-cran --source=cran
    • @Siddharth 检查编辑部分。不用说,但还是;从容器部分模板中删除 command:args:
    • 试过了,还是不行。只有别名部分在工作。其余的不工作
    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 2019-12-22
    • 2021-02-17
    • 2018-12-28
    • 1970-01-01
    • 2021-08-16
    • 2022-01-12
    • 2017-02-07
    相关资源
    最近更新 更多