删除远程Linux Azure托管docker实例上未使用的docker映像将提供';未知速记标志:';a';in-aq';错误 介绍

删除远程Linux Azure托管docker实例上未使用的docker映像将提供';未知速记标志:';a';in-aq';错误 介绍,azure,docker,azure-pipelines,Azure,Docker,Azure Pipelines,大家好,我使用以下指南在Azure中设置了一台Docker机器: 我设法让这一切都正常工作,当在Windows上进行构建时,我现在可以使用Linux Docker主机从创建的源创建Docker映像。(只需使用“Docker:构建映像”步骤,然后使用“Docker:推送映像”步骤,将DockerHostConnection设置为我的Linux构建机器: 但是,此过程会将创建的映像保留在磁盘上 接下来我想做的是创建一个夜间构建来清理图像。我基本上创建了一个新构建,并添加了以下步骤: 在:(

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

我设法让这一切都正常工作,当在Windows上进行构建时,我现在可以使用Linux Docker主机从创建的源创建Docker映像。(只需使用“Docker:构建映像”步骤,然后使用“Docker:推送映像”步骤,将DockerHostConnection设置为我的Linux构建机器:

但是,此过程会将创建的映像保留在磁盘上

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

  • 在:(docker images-a)之前显示docker图像
  • 码头工人信息:(码头工人信息)
  • 删除docker映像:(docker rmi$(docker映像-aq))
  • 在以下内容后显示docker图像:(docker图像-a)
  • 问题 无论何时运行此构建,我似乎都会收到以下错误:

    但奇怪的是,“docker images-aq”命令在之前的步骤中运行良好:

    调查 我开始做一些调查,手动启动从我自己的计算机到远程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文件的结果:

    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本地运行时,我看到了相同的错误:

    从PowerShell运行它,但效果良好:

    编辑…(经过进一步调查) 利用这些知识,我将.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集成步骤基本上存在两个问题:

  • 我认为命令是在CMD而不是PowerShell中运行的,这会导致-a错误
  • 当执行类似于“docker-H….rmi$(docker images-aq)”的操作时,第二个docker命令(docker images…)将与本地docker实例进行对话。因此,我实际上需要一个解决方案,而无需手动提供IP地址和所有证书。(如果我找不到一个好的解决方案,这个问题我可能会用一种很粗糙的方法来解决)

  • 此任务不允许将一个命令的输出通过管道传输到另一个命令。如果我们将输入ps-aqf“status=exited”| ForEach对象{docker rm-vf$|放在任务输入中,则它将实际运行 child_process.spawn(,ps-aqf“status=exited”| ForEach对象{docker rm-vf$})

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


    简单cmd行也会发生同样的情况。不允许对输出进行管道处理,并且整个“-aqf”status=exited“| ForEach Object{docker rm-vf$}”作为参数传递给docker.exe,它作为命令行运行,不支持命令嵌套,您可以使用Shell脚本任务


    类似的线程:

    我修改了Docker VSTS任务以支持输出命令,从而可以链接多个Docker命令

    我已使用此文件创建了Github存储库,并提交了一个拉取请求:

    在下面的示例中,我使用输出变量首先获取Docker映像,然后删除它们。使用VSTS中刚刚发布的条件任务功能,我还设法使VSTS生成在没有找到映像时跳过“删除映像”步骤

    获取Docker图像:

    如果发现任何Docker图像,则删除这些图像


    我知道目前可能是这样。虽然这并不能解决问题,但我正在寻找一个好的解决方法,或者对Docker集成步骤的当前工作方式提出更改请求。基本上,您希望能够像在Linux/PowerShell中一样将命令链接在一起。