Kubernetes容器args报错

范姐 发表于: 2021-01-21   最后更新时间: 2021-12-04 18:28:43   1,490 游览

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

在本地,我可以执行docker镜像运行:

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

我在Kubernetes中使用Image:

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>'

我试了很多方式,用引号啥的,但结果总是一样。我认为Kubernetes以某种方式构建了命令,使得newman可执行文件无法理解它。但我找不到任何相关信息。

如何解决这个问题?

发表于 2021-01-21

Linux的命令是由一连串的单词组成的。如果你在shell提示符下键入一个命令,它就会负责帮你拆成单词,但在Kubernetes args: list中,你需要自己拆出单词。

args:
  - run
  - '<url-to-collection>'
  # 你想让它们作为两个独立的参数,所以需要是2个独立列表
  - --env-var
  - baseUrl=<kubernetes-hostname>

如果两个参数在同一个列表项中,就是一个 "单词"。

# /bin/ls "/app/some directory/some file"
command:
  - /bin/ls
  # 单个参数,包括空格
  - /app/some directory/some file

同样的规则适用于Docker Compose entrypoint:command:以及JSON-syntax Dockerfile ENTRYPOINTCMD指令,只是Docker原生形式也都接受一个纯字符串,它们将在空格上进行分割(在Dockerfile情况下使用shell,但在Compose情况下不使用)。

在你提供的docker run命令中,你的主机系统上的shell会先进行处理,所以--env-var选项和baseUrl=...参数在传递到容器中之前会被拆成单独的参数。

范姐 -> 半兽人 3年前

感谢您的解释,按照这个解决了。不过我还必须删除URL周围的引号,因为使用shell运行命令的话就是必需的。

你的答案

查看kubernetes相关的其他问题或提一个您自己的问题