在远程Linux Azure托管的docker实例上删除未使用的docker镜像会给出未知的速记标记:' a' in -aq'错误

时间:2017-03-17 09:37:52

标签: azure docker azure-pipelines

简介

大家好,我使用以下指南在Azure中设置了Docker机器:

我设法让这一切正常工作,在Windows上进行构建时,我现在可以使用Linux Docker Host从创建的源创建docker镜像。 (通过简单地使用" Docker:构建一个图像"步骤跟随" Docker:推送图像"将DockerHostConnnection设置为我的Linux构建机器:

Build steps for docker image in Azure

然而,此过程会将创建的图像保留在磁盘上。

接下来我要做的是创建一个清理图像的每晚构建。我基本上创建了一个新的构建并添加了以下步骤:

  1. 之前显示泊坞窗图片:(泊坞窗图片-a)
  2. Docker Info :(泊坞窗信息)
  3. 删除泊坞窗图片:( docker rmi $(docker images -aq))
  4. 在以下后显示泊坞窗图像:(泊坞窗图像-a)
  5. 问题

    每当我运行此版本时,我似乎收到以下错误:

    Error docker -a

    奇怪的是,这是命令" docker images -aq"在之前的步骤中工作得很好:

    docker images -aq works fine

    研究

    我开始通过手动将命令从我自己的计算机踢到远程docker主机来进行一些调查,但是遇到了与以下.cmd文件相同的问题:

    docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' login -u ********** -p ********** **********
    docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' images -aq
    docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' rmi $(docker images -a)
    docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' logout **********
    

    此.cmd文件的结果:

    Results of .cmd file

    从.cmd本地运行时,我看到同样的错误:

    Local cmd

    从PowerShell运行它可以正常工作:

    PowerShell works fine

    编辑......(经过更多调查)

    使用这些知识我将.cmd文件修改为.ps1文件似乎更好一些。一个问题是,$(docker ....)从本地docker安装中获取了它的信息。我将脚本更改为以下内容,现在它可以从我的本地计算机运行到Azure Linux docker主机:

    docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' login -u ********** -p ********** **********
    docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' images -a
    docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' rmi -f $(docker -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' images -aq)
    docker.exe -H tcp://**********:2376 --tls --tlscacert='ca.pem' --tlscert='cert.pem' --tlskey='key.pem' logout **********
    

    所以基本上这个现在可行,但是,如何才能使用Azure Docker构建步骤?

    因为Azure Docker Integration步骤似乎基本上存在2个问题:

    1. 我认为命令在CMD而不是PowerShell中运行导致-a error
    2. 在执行以下操作时:' docker -H .... rmi $(docker images -aq)',第二个docker命令(docker images ...)将与本地docker实例通信。所以我真的想要一个解决方案,而无需手动提供IP地址和所有证书。 (这个问题我可能会以一种黑客的方式解决,但如果我找不到一个好的解决方案)

3 个答案:

答案 0 :(得分:0)

此任务不允许将一个命令的输出传递给另一个命令。如果我们输入ps -aqf“status = exited”| ForEach-Object {docker rm -vf $ _}在任务输入中实际运行 child_process.spawn(< docker exe的路径>,ps -aqf“status = exited”| ForEach-Object {docker rm -vf $ _})

整个输入作为参数传递给docker.exe,因此无法将输出重定向到同一任务中的另一个可执行文件。甚至无法在任务中运行另一个可执行文件。这可能是出于安全原因的设计。

简单的cmd行也是如此。管道输出是不允许的,整个“-aqf”status =退出“| ForEach-Object {docker rm -vf $ _}”作为参数传递给docker.exe

答案 1 :(得分:0)

它作为命令行运行,不支持命令嵌套,您可以使用Shell Script任务。

类似帖子:Command nesting in VSTS/TFS

答案 2 :(得分:0)

我已经修改了Docker VSTS任务以支持输出命令,因此可以链接多个Docker命令。

我已经用它创建了一个Github存储库并提交了一个pull请求: https://github.com/devedse/vsts-docker

在下面的示例中,我使用输出变量首先获取Docker镜像,然后将其删除。在VSTS中使用条件任务的刚刚发布的功能,我还设法使VSTS构建跳过"删除图像"每当找不到图像时都会步骤。

获取Docker镜像:

Obtaining the Docker images

如果找到了

,请删除Docker镜像

Removing the Docker images if there are any found