我想使用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可执行文件无法理解它。但我找不到任何相关信息。
如何解决这个问题?
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 DockerfileENTRYPOINT
和CMD
指令,只是Docker原生形式也都接受一个纯字符串,它们将在空格上进行分割(在Dockerfile情况下使用shell,但在Compose情况下不使用)。在你提供的
docker run
命令中,你的主机系统上的shell会先进行处理,所以--env-var
选项和baseUrl=...
参数在传递到容器中之前会被拆成单独的参数。感谢您的解释,按照这个解决了。不过我还必须删除URL周围的引号,因为使用shell运行命令的话就是必需的。
你的答案