解组 yaml 失败

Failed to unmarshall yaml

我有一个执行端点,它 运行 是一个子进程,它又 运行 是一个 rancher-compose 命令,用于在 rancher 上的主机中启动一些容器。当我从节点应用程序点击这个 /execute 端点时,它工作正常并按预期启动容器。当通过 cURL 命令从 bash 脚本访问 /execute 端点时,它失败并给我以下错误。我不明白为什么它会抛出一个错误,即当命令是 运行 通过 bash 脚本时它无法解组我的 yaml 文件。这让我相信这不是我的 yaml 文件的问题。下面我把错误和失败的命令以及我正在使用的 cURL 命令。

我完全迷路了,非常感谢任何帮助!

ERROR starting job, unable to run sub-process for container deployment. >ERR=Error: Command failed: /rancher-tools/rancher-compose --project-name mic-iwbl3g97 --verbose --file docker-compose-job-submitter.yml up -d

job deployment output: time="2016-12-05T04:35:49Z" level=debug msg="Environment Context from file : map[]" time="2016-12-05T04:35:49Z" level=debug msg="Opening compose file: docker-compose-job-submitter.yml" time="2016-12-05T04:35:49Z" level=debug msg="Looking for stack mic-iwbl3g97" time="2016-12-05T04:35:49Z" level=info msg="Creating stack mic-iwbl3g97" time="2016-12-05T04:35:49Z" level=error msg="Failed to unmarshall: yaml: unmarshal errors:\n line 15: cannot unmarshal !!str NaN into int64\n line 16: cannot unmarshal !!str NaN into int64\ncommand:\n- mic-iwbl3g97\n- NaN\n- $input_csv_file\n- $start_year\n- $end_year\ncontainer-name: mic-iwbl3g97\ncpu_shares: 25\nimage: $repo_name:$tag\nlabels:\n io.rancher.container.pull_image: always\n io.rancher.container.start_once: true\n io.rancher.scheduler.affinity:host_label: MIC-Use=TPC_Modeling\n io.rancher.sidekicks: locking, input, output, param, input-helper\nmem_limit: NaN\nmemswap_limit: NaN\nnetwork_mode: none\nvolumes_from:\n- input\n- output\n- param\n- locking\n"

curl -s -X POST -H "Content-Type: application/json" -d '{"S3_param_file":"$input_csv_file", "memory_constraint":"$memory_constraint", "time_constraint":"$time_constraint", "start_year":"$start_year", "end_year":"$end_year", "tag":"$tag", "repo":"$repo_name"}' http://my_ip_address:3000/execute

变量不会用单引号展开,用双引号展开:

curl -s -X POST \
  -H "Content-Type: application/json" \
  -d '{"S3_param_file":"'"$input_csv_file"'", "memory_constraint":"'"$memory_constraint"'", "time_constraint":"'"$time_constraint"'", "start_year":"'"$start_year"'", "end_year":"'"$end_year"'", "tag":"'"$tag"'", "repo":"'"$repo_name"'"}' \
  http://my_ip_address:3000/execute

看看我如何在单引号和双引号之间交换:

'{"json_here": "'"$parameter_here"'"}'
sssssssssssssssssdddddddddddddddddssss

其中s表示单引号,d表示双引号

如上所示,它很快就会变得一团糟,但是可以使用 jq 来创建 JSON:

$ jq -n --arg a "a val" --arg b 'b val'  '{$a, $b}'
{
  "a": "a val",
  "b": "b val"
}