azure - 删除远程 Linux Azure 托管 docker 实例上未使用的 docker 镜像会出现 'unknown shorthand flag: ' a' in -aq' 错误

标签 azure docker azure-pipelines

简介

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

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

Build steps for docker image in Azure

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

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

  1. 之前显示 docker 镜像:(docker images -a)
  2. Docker 信息:(docker 信息)
  3. 删除 docker 镜像:(docker rmi $(docker images -aq))
  4. 在以下位置显示 docker 镜像:(docker images -a)

问题

每当我运行此构建时,我似乎都会收到以下错误:

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 集成步骤似乎存在 2 个问题:

  1. 我认为命令在 CMD 而不是 PowerShell 中运行,这会导致 -a 错误
  2. 当执行类似“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/

相关文章:

azure-devops - 未评估 Azure Pipelines 合并

azure - 从 Azure 恢复应用服务

azure - 锁定期限到期后如何续订锁定?使用 Azure 服务总线 session 队列

docker - "docker: ' 运行 docker compose 时组成 ' is not a docker command"

docker - 如何在IBM Bluemix Docker云中向容器添加卷?

azure-devops - 当我推送整个解决方案的存储库时,是否可以仅部署更新的 Azure Function 项目?

android - 在 Android 中取消订阅 Azure 通知中心标签

azure - 是否可以在Azure Synapse数据仓库中创建时态表

docker - Jenkins 声明式管道 - 将 Docker 镜像推送到私有(private) docker hub 存储库

azure-devops - 如何在 Azure DevOps 中定义 Lighthouse 测试的审核分数断言