使用 Jenkins 从 EC2 删除现有 docker 个图像

deleting existing docker images from EC2 using Jenkins

我必须 运行 AWS 中存在的图像中的一些容器 ECR.As 我需要自动化这个我正在使用 Jenkins。

我有 4 个 ECR 存储库,一旦新版本的图像出现在这个存储库中,我的 jenkins 作业将触发并创建一个新的 container.So,因为微服务代码正在改变,我正在获取新图像ECR 我必须删除旧容器和 运行 同一端口上的新容器。

我正在使用 Jenkins 的 "Send file or execute commands over SSH" 来执行此操作。 然后我提供如下命令

   aws ecr get-login --no-include-email > login.sh
   bash login.sh
   docker pull 944198216610.dkr.ecr.us-east-1.amazonaws.com/demo- 
     docker:latest
   docker run -d -p 8081:80 944198216610.dkr.ecr.us-east- 
        1.amazonaws.com/demo-docker:latest

现在的问题是,每当我获得新图像时,我都必须停止较早的容器 运行ning,为此我需要容器 ID。我不知道要在此处获取容器 ID 以停止 container.Any 在此方面的帮助非常感谢。

获取您可能使用的容器:

docker ps -q --filter "ancestor=944198216610.dkr.ecr.us-east- 
        1.amazonaws.com/demo-docker:latest"

所以删除它们:

docker rm -f $(docker ps -q --filter "ancestor=944198216610.dkr.ecr.us-east- 
        1.amazonaws.com/demo-docker:latest")

您可以将 -a 添加到 docker ps 以同时删除 运行 个容器

ancestor Filters containers which share a given image as an ancestor. Expressed as image-name[:tag], image id, or image@digest

答案已经给出,但我永远不会建议使用

删除容器的重要一件事
docker rm -f

直接发送SIGKILL,没有宽限期。

最好的处理方式是先stop the container然后删除容器,它先发送SIGTERM,然后,在一个宽限期之后, SIGKILL.

此外,如果您不是 运行 ECS,那么硬编码名称就足够了,因为您不是同时 运行 两个容器,所以

docker run --rm --name my_container -d -p 8081:80 944198216610.dkr.ecr.us-east-1.amazonaws.com/demo-docker:latest

所以在部署过程中你需要的一切docker stop my_container它会停止并且容器也会释放名称,所以你可以用相同的名称再次部署。

docker run --rm --name my_container -d -p 8081:80 944198216610.dkr.ecr.us-east-1.amazonaws.com/demo-docker:latest

以下是从 EC2 服务器删除下载图像的命令:

docker image prune

如果您遇到任何问题,请告诉我运行。