Kubernetes 容器参数行为不正确

Kubernetes container args behave incorrect

我想使用 Kubernetes 和 postman/newman Docker 图像来执行我的 API 测试。

在本地,我可以用

执行图像

docker run postman/newman run <url-to-collection> --env-var baseUrl=<local-hostname>

我将图像包含在 Kubernetes 清单文件中

spec:
  containers:
    - name: newman
      image: postman/newman:latest
      args:
        - run
        - '<url-to-collection>'
        - --env-var baseUrl=<kubernetes-hostname>

当我应用清单并查看容器的日志时,出现以下错误:

error: unknown option '--global-var baseUrl=<kubernetes-hostname>'

我用引号尝试了很多事情,并使用 command 部分而不是 args 部分,但总是得到相同的结果。 我认为 Kubernetes 以某种方式构建命令,newman 可执行文件无法理解它。 但是我找不到任何相关信息。

(我还在 Newman GitHub 的回购中创建了一个问题 here

任何人都可以向我解释这个问题的来源以及我如何解决这个问题吗?

无论如何谢谢!

Linux 命令由一系列单词组成。如果您在 shell 提示符下键入命令,它会负责为您将其拆分为单词,但在 Kubernetes args: 列表中,您需要自己拆分单词。

args:
  - run
  - '<url-to-collection>'
  # You want these as two separate arguments, so they need to be
  # two separate list items
  - --env-var
  - baseUrl=<kubernetes-hostname>

如果两个参数在同一个列表项中,则它们是一个“单词”:

# /bin/ls "/app/some directory/some file"
command:
  - /bin/ls
  # a single argument, including embedded spaces
  - /app/some directory/some file

相同的基本规则适用于 Docker Compose entrypoint:command: 以及 JSON-syntax Dockerfile ENTRYPOINTCMD 指令,除了 Docker-native 形式都还接受一个纯字符串,它们将按空格拆分(在 Dockerfile 情况下使用 shell,但在Compose 案例)。

在您提供的 docker run 命令中,主机系统上的 shell 首先处理它,因此 --env-var 选项和 baseUrl=... 参数被拆分成单独的词在它们被传递到容器之前。