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

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

다음 예를 살펴보십시오. 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



답변

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

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

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

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


답변

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

그러나 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


답변

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

docker rm -f container_name || true


답변

당신이 사용할 수있는:

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이 앱 변수와 같거나 아닌지 비교


답변

# 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


답변

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

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

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


답변

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

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