1

我必须从 AWS ECR 中存在的图像运行一些容器。因为我需要自动化,所以我正在使用 Jenkins。

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

我正在使用 Jenkins 的“发送文件或通过 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

现在的问题是,每当我获得新图像时,我都必须停止早期的容器运行,为此我需要容器 ID。我不知道在这里获取容器 ID 来停止容器。对此的任何帮助都非常感谢。

4

3 回答 3

3

获取您可能使用的容器:

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")

您也可以添加-adocker ps删除未运行的容器

祖先过滤将给定图像共享为祖先的容器。表示为 image-name[:tag]、image id 或 image@digest

于 2019-11-04T06:42:56.473 回答
1

答案已经给出,但一件重要的事情我永远不会建议使用移除容器

docker rm -f

它直接发送SIGKILL而没有宽限期。

最好的处理方法是先停止容器然后删除容器,它首先发送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
于 2019-11-04T06:58:44.257 回答
0

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

docker image prune

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

于 2022-02-12T06:19:33.787 回答