首页 > 解决方案 > 如何在 kubernetes 部署 yaml 中执行 bash 字符串操作

问题描述

我正在尝试部署一个 kubernetes 容器,其图像需要一个指向资源的 URL。该资源需要通过 github 身份验证访问,该身份验证包含在集群的机密中。要从这个秘密中获取访问令牌,我必须使用 bash 命令进行一些字符串操作。这是部署 yaml 中的当前容器规范:

    - name: <container-name>
        image: stoplight/prism:latest
        env:
        - name: GITHUB_AUTH
          valueFrom:
            secretKeyRef:
              name: githubregistry
              key: .dockerconfigjson
        args:
        - "mock"
        - "https://$(echo $GITHUB_AUTH | sed 's/{auths:{docker.pkg.github.com:{auth://g' | sed 's/}}}//g' | base64 --decode | cut -d':' -f2)@raw.githubusercontent.com/<path-to-deployment>.yaml"
        - "-h"
        - "0.0.0.0"
        - "-p"
        - "8080"
        ports:
        - name: http
          containerPort: 8080
          protocol: TCP

现在这一行:

    - "https://$(echo $GITHUB_AUTH | sed 's/{auths:{docker.pkg.github.com:{auth://g' | sed 's/}}}//g' | base64 --decode | cut -d':' -f2)@raw.githubusercontent.com/<path-to-deployment>.yaml"

显然没有评估,因为这是部署 yaml 而不是 bash。

知道如何复制这种行为吗?我想我可以用一个 initcontainer 做点什么,但我想避免过于复杂。

标签: dockergithubkubernetes

解决方案


行 [1] 未被评估,因为它作为参数发送到 ENTRYPOINT。

您将需要在 shell 上运行命令。在 [2] 上的“在 shell 中运行命令”部分之后,您将需要以下内容:

- name: <container-name>
        image: stoplight/prism:latest
        env:
        - name: GITHUB_AUTH
          valueFrom:
            secretKeyRef:
              name: githubregistry
              key: .dockerconfigjson
        command: ["/bin/sh"]
        args:
        - "-c"
        - "TOKEN_FETCHED=`https://$(echo $GITHUB_AUTH | sed 's/{auths:{docker.pkg.github.com:{auth://g' | sed 's/}}}//g' | base64 --decode | cut -d':' -f2)@raw.githubusercontent.com/<path-to-deployment>.yaml`"
        - "<your-entrypoint-location> mock $TOKEN_FETCHED -h 0.0.0.0 -p 8080"
        ports:
        - name: http
          containerPort: 8080
          protocol: TCP

因此,您的最后一种方法不起作用,因为您将 line [1] 作为参数发送到入口点。我建议您将命令的输出(行 [1])实际发送到变量 [3],然后将该变量传递给 ENTRYPOINT。

请记住,您需要将入口点的完整位置放在该部分中。您可以通过检查您正在使用的图像来获得此信息:

docker inspect stoplight/prism:latest

并寻找“CMD”输出。

[1]

   - "https://$(echo $GITHUB_AUTH | sed 's/{auths:{docker.pkg.github.com:{auth://g' | sed 's/}}}//g' | base64 --decode | cut -d':' -f2)@raw.githubusercontent.com/<path-to-deployment>.yaml"

[2] https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/

[3] https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/


推荐阅读