도커 컨테이너가 실행중인 경우 실용적으로 중지하고 삭제하려고합니다. 이것은 빌드 스크립트 용입니다.
다음 예를 살펴보십시오. 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 stop
로 docker 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
명령은app
BASH의 변수에서 명령 줄 var 를 가져 옵니다.$app
NR>1
docker 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'