简介
大家好,我使用以下指南在 Azure 中设置了一台 Docker 计算机:
- https://blogs.msdn.microsoft.com/jcorioland/2016/08/19/build-push-and-run-docker-images-with-visual-studio-team-services/
- https://docs.docker.com/machine/drivers/azure/
我设法让这一切正常工作,在 Windows 上进行构建时,我现在可以使用 Linux Docker 主机从创建的源创建 Docker 镜像。 (只需使用“Docker:构建镜像”步骤,然后使用“Docker:推送镜像”步骤,并将 DockerHostConnection 设置为我的 Linux 构建计算机:
但是,此过程会将创建的图像保留在磁盘上。
接下来我想做的是创建一个夜间构建来清理图像。我基本上创建了一个新版本并添加了以下步骤:
- 之前显示 docker 镜像:(docker images -a)
- Docker 信息:(docker 信息)
- 删除 docker 镜像:(docker rmi $(docker images -aq))
- 在以下位置显示 docker 镜像:(docker images -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 文件的结果:
当从 .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 集成步骤似乎存在 2 个问题:
- 我认为命令在 CMD 而不是 PowerShell 中运行,这会导致 -a 错误
- 当执行类似“docker -H .... rmi $(docker images -aq)”之类的操作时,第二个 docker 命令 (docker images...) 将与本地 docker 实例对话。所以我实际上想要一个解决方案,而无需手动提供 IP 地址和所有证书。 (如果我找不到好的解决方案,我可能可以用一种 hacky 的方式解决这个问题)
最佳答案
此任务不允许将一个命令的输出通过管道传输到另一个命令。如果我们输入 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,因此不可能将输出重定向到同一任务中的另一个可执行文件。即使在任务中运行另一个可执行文件也是不可能的。这可能是出于安全原因的设计。
简单的命令行也会发生同样的情况。不允许通过管道传输输出,并且整个“-aqf”status=exited” | ForEach-Object { docker rm -vf $_ } ”作为参数传递给 docker.exe
关于azure - 删除远程 Linux Azure 托管 docker 实例上未使用的 docker 镜像会出现 'unknown shorthand flag: ' a' in -aq' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42853895/