실행중인 경우 Docker 컨테이너 중지 및 삭제


82

도커 컨테이너가 실행중인 경우 실용적으로 중지하고 삭제하려고합니다. 이것은 빌드 스크립트 용입니다.

다음 예를 살펴보십시오. bash 스크립트의 NAMES 열에 표시된대로 Docker 컨테이너 "rabbitmq"를 중지하고 삭제하려면 어떻게해야합니까?

docker ps

CONTAINER ID        IMAGE             COMMAND                  CREATED             STATUS              PORTS                   NAMES
9909a5e2856f        rabbitmq-image   "/docker-entrypoint.s"   11 minutes ago      Up 11 minutes       0.0.0.0:5672->5672/tcp, rabbitmq
8990dd1fe503        redis-image      "/entrypoint.sh redis"   6 weeks ago         Up 4 days           0.0.0.0:32770->6379/tcp redis
etc 

다음 명령은 컨테이너를 삭제하고 원하는 작업을 수행합니다.

docker stop rabbitmq && docker rm -f rabbitmq

그러나 내가 알고 싶은 스크립트로 결합하고 있습니까? 나는 이것이 이렇게 보일 것이라고 생각한다.

#!/bin/bash

if [ /*docker ps check some value */ ]; then
   docker stop rabbitmq && docker rm -f rabbitmq
fi

답변:


190

아시다시피 컨테이너가 존재하지 않거나 실행되지 않는 경우 실패를 나타내는 상태 코드 docker stopdocker rm종료합니다. 이로 인해 빌드가 실패합니다.

빌드 로그의 오류 메시지에 대처할 수 있다면 다음과 같은 작은 트릭을 수행하여 쉘 명령이 실패하는 것을 방지 할 수 있습니다.

docker stop rabbitmq || true && docker rm rabbitmq || true

docker 명령 중 하나가 실패 true하는 경우 항상 성공을 나타내는 상태 코드와 함께 종료되는이 호출됩니다.


컨테이너가 존재하지 않는다는 오류 메시지는 여전히 반환되지만 상태 코드는 성공을 나타냅니다. 내 대나무 파이프 라인 프로세스는 실패하지 않으므로 나를 위해 작동합니다.
shamanSK

3
Error response from daemon: no such id: rabbitmq컨테이너가 이미 제거되었을 때 생성 됩니다.
anubhava

3
@anubhava : 맞습니다. 답변에서 이미 언급했듯이 "속임수"는 docker 명령의 반환 값을 무시하는 것입니다. 오류 메시지없이 "깨끗한"솔루션이 필요한 경우 컨테이너가 있는지 확인해야합니다.
Johannes Barop 2017-06-08

저에게이 명령은 더 이상 작동하지 않습니다. 예전에는 작동했지만 지금은 작동하지 않습니다. 다른 사람에게도 이런 일이 발생합니까?
joudaon

38

비슷한 문제가 있지만 "찾을 수 없음"오류가 아닌 명령에서 모든 오류를 억제하므로 허용 된 답변이 마음에 들지 않았습니다 .

그러나 docker ps -q --filter "name=rabbitmq"해당 이름의 컨테이너가 실제로 존재하는 경우에만 출력을 생성하므로 명령이 빈 문자열을 출력하면 Test에서 영감을 얻었 습니다.

docker ps -q --filter "name=rabbitmq" | grep -q . && docker stop rabbitmq && docker rm -fv rabbitmq

다음 명령은 필터 정의 테스트에도 유용합니다.

docker ps -q --filter "name=rabbitmq" | grep -q . && echo Found || echo Not Found

실제 사용 사례는 이전 작업에서 생성 된 이름 목록에서 현재 존재하는 모든 컨테이너 (실행 여부에 관계없이)를 삭제 한 Ansible 작업 쌍을 정의하는 것이 었습니다.

- name: Check for containers that actually exist
  shell: 'docker ps -aq --filter "name={{ item }}"'
  with_items:
    - '{{ previous_command.stdout_lines }}'
  register: found_containers

- name: Remove the containers found by the above command
  shell: 'docker stop {{ item.item }} && docker rm -fv {{ item.item }}'
  with_items: '{{ found_containers.results }}'
  when: item.stdout

6
사용하는 것이 유용하다고 생각합니다 docker ps -aq .... 이 -a옵션은 존재하지만 현재 실행되고 있지 않은 컨테이너도 찾습니다.
Peter Bloomfield

탁월한 대답, 방금 bash 스크립트에서 이것을 사용하여 이미 실행중인 경우 도커 컨테이너를 다시 시작했습니다. ps -aq@PeterBloomfield가 제안한대로도 사용 됩니다.
Psiloc

컨테이너가 없으면 grep -q .0이 아닌 존재 코드가 있으므로 전체 줄이 있습니다. 따라서 여전히 오류가 발생합니다. 내가 추가 || echo 'not found'하거나 이와 비슷한 것을 강요 합니다. 그리고 그 시점에서 허용 대답에 큰 차이가없는
펠릭스 B.

필터가 전체 명령 반환 코드에 영향을주지 않도록하려면 if 문으로 리팩터링 할 수 있습니다.if docker ps -q --filter "name=rabbitmq" | grep -q .; then docker stop rabbitmq && docker rm -fv rabbitmq; fi
ncoghlan

23

Docker를 오랫동안 사용했습니다. 이것은 Docker 컨테이너를 중지하고 제거하는 선호하는 방법입니다. 진실의 배관은 그것이 항상 성공을 산출하도록 보장하는 것입니다. 그것이 없으면 컨테이너 이름이 존재하지 않으면 bash 스크립트가 종료되고 오류가 발생합니다.

docker rm -f container_name || true

11
docker rm -f container_name &>/dev/null && echo 'Removed old container'
filimonov

도커 컨테이너 rm | Docker 문서 : 실행중인 컨테이너를 강제로 제거합니다 (SIGKILL 사용) .
Jason Law

13

당신이 사용할 수있는:

app="rabbitmq"
if docker ps | awk -v app="$app" 'NR > 1 && $NF == app{ret=1; exit} END{exit !ret}'; then
  docker stop "$app" && docker rm -f "$app"
fi
  • awk명령은 appBASH의 변수에서 명령 줄 var 를 가져 옵니다.$app
  • NR>1docker ps명령 에서 첫 번째 헤더 행을 건너 뜁니다 .
  • $(NF) == app마지막 열 NAMES이 앱 변수와 같거나 아닌지 비교

안녕하세요 그것이 작동하는 대답에 감사드립니다. 당신은 그것의 일을 조금 확장 할 수 있습니다. 내가 app = ''some-rabbitmq '를 가지고 있다면 그것은 hypen을 좋아하지 않습니까?
Robbo_UK

하이픈과 함께 작동해야하며 답변에 몇 가지 설명을 추가하고 있습니다.
anubhava

1
솔루션이 너무 복잡합니다. 두 번째 답변이 더 낫습니다
Scoota P 2017

2
이것이 가장 완벽한 대답입니다. `|| 추가 문제 true`는 도커 오류가있는 bash 스크립트가 여전히 존재한다는 것입니다. 컨테이너의 도커 컨테이너 목록을 확인하면 stop 및 rm이있는 경우에만 호출하여 오류를 제거하고 스크립트가 필요한 모든 컨테이너 명령을 실행할 수 있습니다.
AsAP_Sherb

7
# Stop and remove containers with names like "rabbitmq" and "rabbitmq123" if they exist
CONTAINER_NAME="rabbitmq"
OLD="$(docker ps --all --quiet --filter=name="$CONTAINER_NAME")"
if [ -n "$OLD" ]; then
  docker stop $OLD && docker rm $OLD
fi

4

나는 bash 에서이 주문을 제안합니다.

( docker stop $CONTAINER > /dev/null && echo Stopped container $CONTAINER && \
  docker rm $CONTAINER ) 2>/dev/null || true

항상 0으로 종료하고 컨테이너가 실행 중이 아닌 경우 불평하지 않고 Stopped container $CONTAINER실제로 중지 된 경우 인쇄 합니다.


클린 눈물 아래로, 즉 어떤 컨테이너가 발견되지 자동으로 경우 "실패"하지만, 자동으로하지 않습니다 stop/ rm컨테이너 그것은 발견 된 경우.
emmagras 2010 년

2

여기에 몇 가지 답변을 기반으로 한 일반적인 양식 :

docker rm -f container_name > /dev/null 2>&1 && echo 'removed container' || echo 'nothing to remove'


0

당신이 원하는 경우 script.sh에이 코드를 복사 stop하고 remove모든

#!/bin/sh
ids=$(docker ps -a -q)
for id in $ids
do
  echo "$id"
  docker stop $id && docker rm $id
done

0

중지 된 컨테이너를 삭제하지 않는 경우이를 해결하는 또 다른 간단한 방법 docker ps -a은 항상 해당 컨테이너 ID를 반환 하는에 의존 하는 것입니다. 그런 다음 docker stop중지 된 컨테이너에서 실행 하면 멱등 적으로 아무 작업도 수행되지 않습니다.

docker stop $(docker ps -a --filter name= rabbitmq -q )


-2

먼저 모든 컨테이너를 중지하려면 모든 컨테이너를 중지해야합니다.

docker kill $(docker ps -q)

모든 컨테이너를 삭제하려면

docker rm $(docker ps -a -q)

그리고 모든 이미지를 삭제하려면 이것은 명령입니다

docker rmi $(docker images -q)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.