向 Docker 发送 2 个命令,其中 1 个是另一个的输出

Send 2 commands to Docker with 1 being an ouput into the other

我有一个 Azure CLI 容器 运行ning。我想向容器发送 2 个命令;

  1. 查找带有 X 标记的资源:az resource list --tag az=test --query "[].id" -otsv
  2. 删除带有 X 标记的资源:az resource delete --ids $(az resource list --tag az=test --query "[].id" -otsv)

我的 image/container 已将环境变量编码到其中,因此如果我要 运行 任何 Az 命令,它将 运行 针对其中保存的服务主体。

如果我要登录容器并 运行 一行命令,它会工作得很好:

λ docker run -it asdf sh
/bin # az resource delete --ids $(az resource list --tag az=test --query "[].id" -otsv)
/bin #

但如果我要 运行 在容器(或映像)外部执行命令,它会要求我登录 Az CLI:

λ docker run asdf az resource delete --ids $(az resource list --tag az=test --query "[].id" -otsv)
Please run 'az login' to setup account.
ERROR: az resource delete: error: argument --ids: expected at least one argument
usage: az resource delete [-h] [--verbose] [--debug]
                          [--output {json,jsonc,table,tsv}] [--query JMESPATH]
                          [--ids RESOURCE_IDS [RESOURCE_IDS ...]]
                          [--resource-group RESOURCE_GROUP_NAME]
                          [--namespace RESOURCE_PROVIDER_NAMESPACE]
                          [--parent PARENT_RESOURCE_PATH]
                          [--resource-type RESOURCE_TYPE]
                          [--name RESOURCE_NAME] [--api-version API_VERSION]
                          [--subscription _SUBSCRIPTION]

似乎 bash 查看了 $(..) 命令,但没有将其发送给 image/container。我曾尝试使用 \ 转义字符,但它会带回一些其他随机错误,我知道 -otsv 确实有效。

λ docker run asdf az resource delete --ids $\(az resource list --tag az=test --query "[].id" -ots
v\)
ERROR: az resource delete: 'tsv)' is not a valid value for '--output'. See 'az resource delete --help'.

The most similar choice to 'tsv)' is:
        tsv

我是 Bash 的新手,我通常使用 PowerShell,但这次我们必须使用 Bash。通常在 PowerShell 中,我可以将搜索结果通过管道传输到另一个命令中以删除资源,所有这些都在一行中......但是,在这种情况下我不知道该怎么做。

有什么想法吗?

仅供参考:我将从 Azure Functions 向此 运行ning 容器发送自动命令以执行所述资源的删除,因此我无法 运行 交互式shell.

错误说明原因。如果你想在容器中执行azure Cli,你可以使用命令docker exec -it containerName bash连接到容器中,或者你做你做的。但总而言之,您应该先登录 Azure CLI。

对于你的第二个错误,参数应该是-o tsv

更新 1

我测试了命令docker run imageName az resource delete,结果给出了唯一的错误,请运行 'az login' 设置帐户。

因此无论您想使用 Azure CLI 做什么,都应该先登录。

更新 2

要实现这一点,您可以在两个命令行之间添加&。整个命令将像这样:

docker run docker_image_name az login & az resource delete --ids $(az resource list --name resource_name --query "[].id" -o tsv)

因为两者的命令az login会先执行,所以要先登录。不过不用担心,第二个命令也会在您登录后执行。

在被跟踪之后我终于回到了这里。原来是需要倒逗号;

docker run -it asdf bash -c 'az resource delete --ids $(az resource list --tag az=test --query "[].id" -otsv)'

多亏了这个给了我想法;