大家好,我使用以下指南在Azure中设置了Docker机器:
我设法让这一切正常工作,在Windows上进行构建时,我现在可以使用Linux Docker Host从创建的源创建docker镜像。 (通过简单地使用" Docker:构建一个图像"步骤跟随" Docker:推送图像"将DockerHostConnnection设置为我的Linux构建机器:
然而,此过程会将创建的图像保留在磁盘上。
接下来我要做的是创建一个清理图像的每晚构建。我基本上创建了一个新的构建并添加了以下步骤:
每当我运行此版本时,我似乎收到以下错误:
奇怪的是,这是命令" 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文件的结果:
从.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 Integration步骤似乎基本上存在2个问题:
答案 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任务。
答案 2 :(得分:0)
我已经修改了Docker VSTS任务以支持输出命令,因此可以链接多个Docker命令。
我已经用它创建了一个Github存储库并提交了一个pull请求: https://github.com/devedse/vsts-docker
在下面的示例中,我使用输出变量首先获取Docker镜像,然后将其删除。在VSTS中使用条件任务的刚刚发布的功能,我还设法使VSTS构建跳过"删除图像"每当找不到图像时都会步骤。
获取Docker镜像:
如果找到了
,请删除Docker镜像