向Docker发送2个命令,其中1个成为其他输出

时间:2018-07-30 09:42:34

标签: bash azure docker command-line-interface azure-cli

我有一个正在运行的Azure CLI容器。我想向容器发送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)

我的图像/容器中已编码了环境变量,因此,如果我要运行任何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似乎看着$(..)命令,并且没有将其发送到图像/容器。我曾尝试使用\来转义字符,但是在我知道-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向该正在运行的容器发送自动化命令,以执行上述资源的删除操作,因此我将无法运行交互式外壳程序。

2 个答案:

答案 0 :(得分:0)

错误说明了原因。如果要在容器中执行Azure Cli,则可以使用命令docker exec -it containerName bash连接到容器,也可以执行操作。但总而言之,您应该首先登录Azure CLI。

对于第二个错误,参数应为-o tsv

更新1

我测试了命令docker run imageName az resource delete,结果给出了唯一的错误,请运行“ az登录”来设置帐户。 enter image description here

因此,无论您要使用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将首先执行,因此您必须先登录。但是不用担心,第二个命令也会在您登录后执行。

答案 1 :(得分:0)

在被跟踪之后,我终于回到了这一点。原来是需要用逗号隔开;

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

谢谢你给我这个主意; Execute two commands with docker exec