Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正确地保持docker VSTS/Azure Devops构建代理干净且缓存_Docker_Build_Kubernetes_Azure Devops_Azure Pipelines - Fatal编程技术网

正确地保持docker VSTS/Azure Devops构建代理干净且缓存

正确地保持docker VSTS/Azure Devops构建代理干净且缓存,docker,build,kubernetes,azure-devops,azure-pipelines,Docker,Build,Kubernetes,Azure Devops,Azure Pipelines,我们已经向我们的开发Kubernetes集群添加了一个停靠构建代理,我们使用它作为Azure Devops管道的一部分构建应用程序。我们创造了自己的形象 构建代理使用Docker外部的Docker(DooD)在我们的开发集群上创建映像 该代理在几天内工作正常,但在构建管道中的docker命令上偶尔会出现错误: 来自守护程序的错误响应:没有这样的映像:fooproject:ci-3284.2 /usr/local/bin/docker失败,返回代码:1 我们意识到构建代理正在创建大量未被删除的图像

我们已经向我们的开发Kubernetes集群添加了一个停靠构建代理,我们使用它作为Azure Devops管道的一部分构建应用程序。我们创造了自己的形象

构建代理使用Docker外部的Docker(DooD)在我们的开发集群上创建映像

该代理在几天内工作正常,但在构建管道中的docker命令上偶尔会出现错误:

来自守护程序的错误响应:没有这样的映像:fooproject:ci-3284.2 /usr/local/bin/docker失败,返回代码:1

我们意识到构建代理正在创建大量未被删除的图像。有大量的图像阻塞了构建代理,并且缺少图像,这可以解释“没有这样的图像”错误消息

通过使用以下命令向构建管道添加步骤,我们能够使构建代理重新工作:

docker system prune -f -a
当然,这会删除我们所有的图像,每次都必须从头开始构建,这会导致构建花费不必要的时间

我确信这一定是一个解决了的问题,但我还没有找到任何关于处理停靠的构建代理随着时间的推移变得阻塞的正常策略的文档。作为docker和kubernetes的新手,我可能根本不知道自己在寻找什么在维护缓存的同时,创建保持干净且功能正常的停靠生成代理的最佳做法是什么?

编辑:一些想法:

  • 创建一个生成步骤,清除给定管道中除最新映像以外的所有映像(但这仍可能阻塞生成服务器)
  • 运行cron作业,每x天删除一次所有映像(这将导致作业运行后第一次生成的速度变慢,并且如果发现大量使用,仍可能阻塞生成服务器)
  • 每晚清除所有映像,并在工作时间以外运行所有生成。这样,生成将在白天快速运行。但是大量使用仍可能阻塞生成服务器
编辑2:

我发现一个患有a型糖尿病的人似乎正试图做与我完全相同的事情。他提出了一个解决方案,他描述如下:

我正试图弄清楚如何在不删除构建依赖项的情况下从自动构建环境中删除“旧”映像。这意味着我不能只按年龄删除,因为nodejs映像可能在几周内不会更改,而我的应用构建可能在几分钟内毫无价值

docker image rm$(docker image ls--filter reference=docker--quiet)

这个小宝石正是我所需要的。我把我的存储库名称放在了引用变量中(不是最简单的)。因为我标记了构建号和最新版本,
docker image rm
命令在我想要保留的映像上失败了。我真的不喜欢使用守护程序错误作为保护机制,但它是有效的

为了遵循这些说明,我将
最新的
标记应用于该过程中构建的所有内容,然后运行

docker image ls--过滤器引用=fooproject

如果我尝试删除这些,则会出现以下错误:

来自守护程序的错误响应:冲突:无法删除b870ec9c12cc(必须强制)-映像在多个存储库中引用


这会阻止删除最新的一个。但是,这并不是一个干净的方法。一定有更好的方法吗?

可能您已经找到了解决方案,但社区的其他成员在这里找到答案可能会很有用

docker prune
的用途有限。创建它是为了解决清除所有本地docker映像的问题。(正如thaJeztah所述)

要以更精确的方式删除图像,最好将此任务分为两部分: 1.选择/筛选要删除的图像 2.删除所选图像的列表

例如:

可以组合筛选器子句以获得您想要的内容:
(我使用Kubernetes主节点作为示例环境)

如中所述,
images
/
images ls
过滤器比
docker prune
过滤器要好得多,后者只支持
until
子句:

The currently supported filters are:
• dangling (boolean - true or false)  
• label (label=<key> or label=<key>=<value>)  
• before (<image-name>[:<tag>], <image id> or <image@digest>) - filter images created before given id or references
• since (<image-name>[:<tag>], <image id> or <image@digest>) - filter images created since given id or references
将它们组合起来并将结果放入CI/CD管道,这样您就可以在本地缓存中只保留所需的映像,而不会在构建服务器上收集大量垃圾

我在这里复制了一个使用strajansebastian提供的方法的好例子:


VAS提供的解决方案对您有效吗?您得到干净的解决方案了吗?
$ docker images

REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy                v1.14.2             5c24210246bb        3 months ago        82.1MB
k8s.gcr.io/kube-apiserver            v1.14.2             5eeff402b659        3 months ago        210MB
k8s.gcr.io/kube-controller-manager   v1.14.2             8be94bdae139        3 months ago        158MB
k8s.gcr.io/kube-scheduler            v1.14.2             ee18f350636d        3 months ago        81.6MB  # before
quay.io/coreos/flannel               v0.11.0-amd64       ff281650a721        6 months ago        52.6MB
k8s.gcr.io/coredns                   1.3.1               eb516548c180        7 months ago        40.3MB  # since
k8s.gcr.io/etcd                      3.3.10              2c4adeb21b4f        8 months ago        258MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        20 months ago       742kB

$ docker images --filter "since=eb516548c180" --filter "before=ee18f350636d" 

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
quay.io/coreos/flannel   v0.11.0-amd64       ff281650a721        6 months ago        52.6MB

$ docker images --filter "since=eb516548c180" --filter "reference=quay.io/coreos/flannel" 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
quay.io/coreos/flannel   v0.11.0-amd64       ff281650a721        6 months ago        52.6MB

$ docker images --filter "since=eb516548c180" --filter "reference=quay*/*/*" 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
quay.io/coreos/flannel   v0.11.0-amd64       ff281650a721        6 months ago        52.6MB

$ docker images --filter "since=eb516548c180" --filter "reference=*/*/flan*" 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
quay.io/coreos/flannel   v0.11.0-amd64       ff281650a721        6 months ago        52.6MB
The currently supported filters are:
• dangling (boolean - true or false)  
• label (label=<key> or label=<key>=<value>)  
• before (<image-name>[:<tag>], <image id> or <image@digest>) - filter images created before given id or references
• since (<image-name>[:<tag>], <image id> or <image@digest>) - filter images created since given id or references
grep "something"      # to include only specified images
grep -v "something"   # to exclude images you want to save
sort [-k colN] [-r] [-g]] | head/tail -nX  # to select X oldest or newest images
#example of deleting all builds except last 2 for each kind of image 
#(the image kind is based on the Repository value.)

#If you want to preserve just last build modify to tail -n+2.

# delete dead containers
docker container prune -f

# keep last 2 builds for each image from the repository
for diru in `docker images --format "{{.Repository}}" | sort | uniq`; do
    for dimr in `docker images --format "{{.ID}};{{.Repository}}:{{.Tag}};'{{.CreatedAt}}'" --filter reference="$diru" | sed -r "s/\s+/~/g" | tail -n+3`; do 
        img_tag=`echo $dimr | cut -d";" -f2`; 
        docker rmi $img_tag;
    done;
done

# clean dangling images if any
docker image prune -f