itsource

이미지 이름으로 도커 컨테이너 중지 - Ubuntu

mycopycode 2023. 10. 19. 22:19
반응형

이미지 이름으로 도커 컨테이너 중지 - Ubuntu

Ubuntu 14.04 (Trusty Tahr)에서 실행 중인 컨테이너를 중지하는 방법을 찾고 있는데 도커 실행 명령에서 사용된 이미지 이름만 가지고 있습니다.

해당 이미지 이름과 일치하는 일치하는 실행 중인 모든 컨테이너를 찾아서 중지하는 명령이 있습니까?

알고 계시다면.image:tag정확한 컨테이너 버전

8959호에 이어 좋은 출발은 다음과 같습니다.

docker ps -a -q --filter="name=<containerName>"

부터.name이미지 이름이 아닌 컨테이너를 참조합니다. koekiebox답변에 언급된 최신 Docker 1.9 필터 조상을 사용해야 합니다.

docker ps -a -q  --filter ancestor=<image-name>

Kiril이 아래에 언급한 바와 같이, 이러한 용기를 제거하기 위해:

stop컨테이너도 반환합니다.

.stop그리고.rm작업을 수행할 것입니다.

docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="{{.ID}}"))

이미지 이름만 알고 있는 경우(아닙니다)image:tag)

Alex Jansen논평에서 지적한 바와 같이:

상위 옵션은 와일드카드 매칭을 지원하지 않습니다.

알렉스가 해결책을 제안하지만, 당신이 같은 이미지에서 여러 의 컨테이너를 실행하고 있을 때, 내가 실행할 수 있었던 것은 (당신의)~/.bashrc예를 들어):

dsi() { docker stop $(docker ps -a | awk -v i="^$1.*" '{if($2~i){print$1}}'); }

그 다음에 그냥 내 bash 세션을 호출합니다(소싱 후).~/.bashrc):

dsi alpine

그리고 모든 컨테이너는alpine.*:xxx멈출 겁니다.

의미: 이름이 시작하는 이미지alpine.
당신이 조정해야 할 수도 있습니다.awk -v i="^$1.*"네가 원한다면^$1.*더 정확히 말하면요

그럼요, 그럼요.

drmi() { docker rm $(dsi $1  | tr '\n' ' '); }

a.drmi alpine멈추어서 모든 것을 제거할 것입니다alpine:xxx컨테이너.

이전의 답변은 제게 맞지 않았지만, 이것은 효과가 있었습니다.

docker stop $(docker ps -q --filter ancestor=<image-name> )

컨테이너 이름 설정을 시작할 수 있습니다.

docker run -d --name <container-name> <image-name>

동일한 이미지를 사용하여 여러 개의 용기를 회전시킬 수 있으므로 용기를 시작하는 것이 좋습니다.그러면 이 컨테이너 이름을 사용해서 정지하고, 부착하고...컨테이너:

docker exec -it <container-name> bash
docker stop <container-name>
docker rm <container-name>

이 코드는 이미지 centos:6모든 컨테이너를 정지시킵니다.저는 그것에 대한 더 쉬운 해결책을 찾을 수 없었습니다.

docker ps | grep centos:6 | awk '{print $1}' | xargs docker stop

또는 더 짧은 경우:

docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')

컨테이너 실행을 중지하는 두 가지 방법:

1. $docker stop container_ID

2. $docker kill container_ID

다음 명령을 사용하여 실행 중인 컨테이너를 가져올 수 있습니다.

$docker ps

자세한 내용은 다음 링크를 참조하십시오.

이렇게 하면 이미지 = "yourImgName"이 있는 모든 컨테이너만 중지됩니다.

sudo docker stop $(sudo docker ps | grep "yourImgName" | cut -d " " -f 1)

그러면 이미지 = "yourImgName"이 있는 모든 컨테이너가 중지되고 제거됩니다.

sudo docker rm $(sudo docker stop $(sudo docker ps -a | grep "yourImgName" | cut -d " " -f 1))

을 ./usr/local/bin/docker.stop이미지 이름을 입력합니다(assumes 실행 중인 것은 하나뿐임).

docker stop $(docker ps -q -f "name=$1")

이미지 이름으로 도커 컨테이너 중지:

imagename='mydockerimage'
docker stop $(docker ps | awk '{split($2,image,":"); print $1, image[1]}' | awk -v image=$imagename '$2 == image {print $1}')

이미지 이름 및 태그별 도커 컨테이너 중지:

imagename='mydockerimage:latest'
docker stop $(docker ps | awk -v image=$imagename '$2 == image {print $1}')

이미지를 만든 경우, 이미지에 레이블을 추가하고 실행 중인 컨테이너를 레이블별로 필터링할 수 있습니다.

docker ps -q --filter "label=image=$image"

신뢰할 수 없는 메소드

docker ps -a -q  --filter ancestor=<image-name>

항상 작동하는 것은 아닙니다.

docker ps -a -q --filter="name=<containerName>"

이미지 이름이 아닌 컨테이너 이름으로 필터

docker ps | grep <image-name> | awk '{print $1}'

이미지 이름이 다른 이미지의 다른 열에 나타날 수 있으므로 문제가 있음

모든 컨테이너를 정보 및 ID와 함께 나열합니다.

docker ps

docker stop CONTAINER ID

도커 버전 18.09.0의 경우 포맷 플래그가 필요 없음을 알게 되었습니다.

docker rm $(docker stop $(docker ps -a -q -f ancestor=<image-name>))

@VonC 최고의 답변 외에 .zshrc 파일에 추가할 수 있는 ZSH 기능이 있습니다.

dockstop() {
  docker rm $(docker stop $(docker ps -a -q --filter ancestor="$1" --format="{{.ID}}"))
}

그러면 명령 줄에서, 간단히 하시오.dockstop myImageName그리고 myImageName이라는 이미지에서 시작된 모든 컨테이너를 중지하고 제거합니다.

도커 명령어를 꿀꺽꿀꺽 작업으로 포장하려고 하다가 당신이 다음을 할 수 있다는 것을 깨달았습니다.

docker stop container-name
docker rm container-name

이름이 같은 여러 개의 컨테이너가 있는 시나리오에서는 작동하지 않을 수 있지만(가능하다면), 제 사용 사례에서는 완벽했습니다.

나같은 경우에는--filter ancestor=<image-name>작동하지 않아 다음 명령으로 도커 컨테이너를 정리했습니다.

docker rm $(docker stop $(docker ps -a -q --filter "name=container_name_here" --format="{{.ID}}"))

용도: 도커 컨테이너 중지($ docker 컨테이너 ls -q --filter parent=mongo)

    (base) :~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
    d394144acf3a        mongo               "docker-entrypoint.s…"   15 seconds ago      Up 14 seconds       0.0.0.0:27017->27017/tcp   magical_nobel
    (base) :~ user$ docker container stop $(docker container ls -q --filter ancestor=mongo)
    d394144acf3a
    (base) :~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    (base) :~ user$

도커 컨테이너를 재구축하고 중지하고 다시 시작하는 스크립트입니다.

docker pull [registry]/[image]:latest
docker build --no-cache -t [localregistry]/[localimagename]:latest -f compose.yaml context/
docker ps --no-trunc | grep [localimagename] | awk '{print $1}' | xargs docker stop
docker run -d -p 8111:80 [localregistry]/[localimagename]:latest

note --no-trunc 인수는 이미지 이름 또는 기타 정보를 출력에서 전체적으로 보여줍니다.

이미지 태그를 지정할 필요가 없는 간결한 명령어는 다음과 같습니다(대부분의 답변이 그렇듯).

docker stop $(docker ps -a | awk -v i="^${image_name}.*" '{if($2~i){print$1}}')

docker stop $(docker ps -a | grep "zalenium")
docker rm $(docker ps -a | grep "zalenium")

이정도면 충분하네.

만약 당신이 심플함을 선호한다면AWK접근, 여기 제 의견이 있습니다.

docker rm -f $(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}')

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}')- 입력 이미지를 기준으로 도커 컨테이너 이름을 인쇄합니다.

docker ps- 모든 용기를 나열

awk '{ if($2 == "<your-image-name>") { print $NF}}'- 두 번째 구문 분석 열은docker ps이미지 이름을 지정합니다.이미지 이름과 비교하면 실행됩니다.print $NF컨테이너 이름을 인쇄합니다.

docker rm -f컨테이너를 제거합니다.

예를 들어, ubuntu 이미지의 실행 중인 모든 컨테이너를 제거하는 작업은 다음과 같이 간단하게 수행할 수 있습니다.

docker rm -f $(docker ps | awk '{ if($2 == "ubuntu:latest") { print $NF}}')

추신: 이미지 태그는 AWK에 포함하는 것을 기억하세요. 동등한 비교기니까요.

컨테이너 이름의 일부를 알고 있다면 다음과 같이 도커와 함께 AWK를 사용할 수 있습니다.

  CONTAINER_IDS=$(docker ps -a | awk '($2 ~ /container.*/) {print $1}')
  if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then
    echo "No containers available for deletion"
  else
    docker rm -f $CONTAINER_IDS
  fi
image: docker
services:
  - docker:dind
stages:
  - deploy
step-deploy-prod:
  stage: deploy
  tags:
  - docker
  script:
    - container_id=$(docker ps -q -a -f status=running --filter name=todoapp)
    - if [ -n "$container_id" ]; then 
        docker stop $container_id; 
        docker rm -f $container_id;
      fi
    - container_id=$(docker ps -q -a -f status=exited --filter name=todoapp)
    - if [ -n "$container_id" ]; then 
        docker rm -f $container_id;
      fi
    - docker build -t app/creative .
    - docker run -d -p 8081:80 --name todoapp app/creative

먼저 명령어로 실행중인 컨테이너를 확인합니다.docker ps -q -a -f status=running --filter name=todoapp, 만약 그것이 하나를 발견하면 그것은 멈추고 실행중인 컨테이너를 삭제한 다음, 정지된 컨테이너를 확인하고 이름을 가지고 있습니다.todoapp명령어 사용docker ps -q -a -f status=exited --filter name=todoapp, 발견되면 컨테이너를 제거할 겁니다그런 다음 새 이미지를 만들고 새 빌드 이미지로 새 컨테이너를 시작합니다.

제가 알아낸 바와 같이, 컨테이너를 멈추면, 그 컨테이너는 다음과 같이 찾을 수 없습니다.docker rmgitlab-ci를 통해 새로 배포된 이미지를 교체하고 싶다면 누군가가 이 문제를 발견할 경우를 대비합니다.

에 옵션이 있습니다.docker ps지휘권을-f status=exited여기에는 정지 상태에 있는 모든 컨테이너가 표시됩니다.

container_id=$(docker ps -q -a -f status=exited --filter name=todoapp)

이 명령은 중지되고 이름이 todoapp인 컨테이너 ID만 반환합니다.

또한 정지된 용기를 제거하는 더 좋은 방법은-f아니면--force옵션으로 선택합니다.docker rm지휘.이 옵션은 컨테이너가 정지 상태에 있더라도 컨테이너를 제거합니다.

사용할 수 있습니다.ps실행 중인 컨테이너를 살펴보도록 명령합니다.

docker ps -a

거기서부터 당신이 찾으시는 컨테이너 ID와 함께 당신의 컨테이너 이름이 보일 것입니다.대한 자세한 내용은 다음과 같습니다.

언급URL : https://stackoverflow.com/questions/32073971/stopping-docker-containers-by-image-name-ubuntu

반응형