지정된 이름의 도커 컨테이너가 존재하지 않는 경우에만 Bash 명령을 실행하는 방법
Jenkins 머신에서는 (셸 스크립트에) 존재하지 않는 경우에만 지정된 이름으로 도커 컨테이너를 만듭니다.컨테이너를 생성하기 위한 명령어를 실행하여 오류가 있으면 무시해도 좋다고 생각했습니다만, 이 때문에 jenkins 작업이 실패합니다.
그래서 도커 컨테이너가 있는지 bash를 사용하지 않는지 어떻게 확인할 수 있는지 알고 싶습니다.
실행 중인 컨테이너가 존재하지 않는지 확인하려면 다음 항목에 대해 그리핑합니다.<name>
나중에 이렇게 켜면 돼
[ ! "$(docker ps -a | grep <name>)" ] && docker run -d --name <name> <image>
뛰어난 기능:
https://docs.docker.com/engine/reference/commandline/ps/을 사용하여 컨테이너를 실행하기 전에 먼저 제거할 수 있도록 종료된 컨테이너가 차단되는지 확인합니다.
if [ ! "$(docker ps -a -q -f name=<name>)" ]; then
if [ "$(docker ps -aq -f status=exited -f name=<name>)" ]; then
# cleanup
docker rm <name>
fi
# run your container
docker run -d --name <name> my-docker-image
fi
그렇구나.
docker container inspect <container-name> || docker run...
도커 컨테이너 검사 호출은 컨테이너가 존재하지 않는 경우 $?를 1로 설정하지만(컨테이너가 존재하는 경우) $?를 0으로 설정하므로(이는 정지된 컨테이너에 관한 것입니다).따라서 run 명령어는 컨테이너가 예상대로 존재하지 않는 경우에만 호출됩니다.
사용할 수 있습니다.filter
그리고.format
옵션docker ps
명령어를 사용하여 다음과 같은 Unix 유틸리티를 사용하여 배관을 회피합니다.grep
,awk
기타.
name='nginx'
[[ $(docker ps --filter "name=^/$name$" --format '{{.Names}}') == $name ]] ||
docker run -d --name mynginx <nginx-image>
이름 앞에 ^/를 붙이고 접미사에 $를 붙입니다.정규 표현인 것 같습니다.
CONTAINER_NAME='mycontainername'
CID=$(docker ps -q -f status=running -f name=^/${CONTAINER_NAME}$)
if [ ! "${CID}" ]; then
echo "Container doesn't exist"
fi
unset CID
도커 탑을 사용하면 더 짧아집니다.
docker top <name> || docker run --name <name> <image>
docker top
실행 중인 이름과 일치하는 컨테이너가 없는 경우 0이 아닌 값을 반환합니다.그렇지 않으면 pid, user, running time 및 명령을 반환합니다.
견고한 GREP^$
문서화되지 않은 행동을 하지 않고
이것이 제가 찾을 수 있는 가장 정확하고 유연한 접근법입니다.
container_name=mycont
if sudo docker ps -a --format '{{.Names}}' | grep -Eq "^${container_name}\$"; then
echo exists
else
echo 'does not exist'
fi
근거:
- 컨테이너 이름이 다른 컨테이너의 하위 문자열이면 https://stackoverflow.com/a/38576401/895245이 작동하지 않습니다.
- https://stackoverflow.com/a/45171589/895245 및 https://stackoverflow.com/a/43202632/895245은 매뉴얼을 찾을 수 없는 동작에 의존합니다.이러한 동작은
docker container inspect
그리고 그것-f name
일종의 규칙적인 표현을 사용합니다.
파이썬
프로젝트에서 사용하게 된 Python 버전입니다.
containers = subprocess.check_output([
'sudo',
'docker',
'ps',
'-a',
'--format', '{{.Names}}',
]).decode()
if container_name in containers.split():
# Exists.
이것은 가동 중인 용기가 있는지 확인하고 정지시킨 후 제거하는 제 해결책입니다.
CNAME=$CONTAINER_NAME-$CODE_VERSION
if [ "$(docker ps -qa -f name=$CNAME)" ]; then
echo ":: Found container - $CNAME"
if [ "$(docker ps -q -f name=$CNAME)" ]; then
echo ":: Stopping running container - $CNAME"
docker stop $CNAME;
fi
echo ":: Removing stopped container - $CNAME"
docker rm $CNAME;
fi
위의 100개 이상의 답변도 실제로 작동하지 않기 때문에 너무 많이 검색해야 했습니다.도커 ps에 대한 오해가 원인이라고 생각합니다. docker ps
에 실행 중인 컨테이너 목록을 나타냅니다. docker ps -q
container_id는 container_id를 말합니다. docker ps -a
에 모든 컨테이너(실행 여부)를 나타냅니다. docker ps -qa
은 모든 입니다.docker ps -q
는 실행 중인 컨테이너의 단순한 목록입니다. docker ps -q -f name=ContainerName
그러면 ContainerName이라는 이름의 실행 중인 컨테이너의 단순한 목록이 나타납니다. docker ps -qa -f
종료된 컨테이너도 포함되므로 논리적으로 -a(거기, 실행 여부)를 확인한 다음 -a를 사용하지 않고 -a가 있는지 확인하고 실행 중인지 여부를 확인해야 합니다(그리고 먼저 중지해야 합니다).
도커 컨테이너가 존재하는지 확인하려면 다음 코드를 사용합니다.
CONTAINER_NAME='my_docker_container'
# Checking if docker container with $CONTAINER_NAME name exists.
COUNT=$(docker ps -a | grep "$CONTAINER_NAME" | wc -l)
if (($COUNT > 0)); then
echo 'container exists'
fi
-a
모든 상태(실행 중, 실행 중 등)를 나열하는 경우
-f status=running
( 중인 없음) ('실행 중인 컨테이너만 나열하는 경우)
$ docker ps -f name=containerName | grep containerName
1개 이상의 행이 있는 경우 명령어 상태 코드는 0이 됩니다.컨테이너가 없는 경우 GREP는 1개의 상태 코드로 종료됩니다.다음 방법으로 처리할 수 있습니다.
창문들
$ echo %errorlevel%
리눅스
$ echo $?
참고 자료: https://www.cyberciti.biz/faq/linux-bash-exit-status-set-exit-statusin-bash/
if [[ $(sudo docker inspect --format . <container-name>) == "." ]]; then
docker run <container-name>;
fi
설명:
이미 비슷한 반응이 있어요.서의 는 ★★★★★★★★★★★★★★★★★★★★★★★.--format .
도 사용할 수 .-f .
). 그러면 inspect 명령에서 모든 세부 정보가 삭제됩니다.도커는 go template 형식을 사용합니다.이 경우 도커는 인식되지 않는 모든 형식을 출력에 복사합니다.
★★★★★★★★★★★★★★★★★.-f itIsThere
itIsThere
'namex'는 'namex'입니다.와 메시지오류 코드」)를 반환합니다.Error: No such object: <container-name>
를 참조해 주세요.
젠킨스 로그에서 이걸 찾았어요
다음 예에서는 정확한 이름으로 도커 컨테이너 존재 여부를 확인하는 방법을 보여 줍니다.
(docker ps -a --format {{.Names}} | grep container_name -w) && echo Exists || echo "Doesn't exist"
종료된 컨테이너를 건너뜁니다.-
CONTAINER_NAME=xyz
if [ ! "$(docker ps -a | grep ${CONTAINER_NAME} | grep -v Exited)" ]; then echo "${CONTAINER_NAME} is not running"; else echo "${CONTAINER_NAME} is running"; fi
@Fernando César 。
, 의 컨테이너명으로부터 가 출력( 「ID」)이 됩니다.2> /dev/null
를 참조해 주세요.
CONTAINER_NAME="awesome-container"
CONTAINER_ID=$(docker inspect --format="{{.Id}}" ${CONTAINER_NAME} 2> /dev/null)
if [[ "${CONTAINER_ID}" ]]; then
# container found.
else
# container not found.
fi
bash 스크립트에서는 다음과 같이 이름으로 컨테이너가 존재하는지 확인합니다.
CONTAINER_NAME="my-container-name"
if ! docker container ls -a | grep -Fq "$CONTAINER_NAME" 1>/dev/null; then
echo "could not found container $CONTAINER_NAME..."
fi
언급URL : https://stackoverflow.com/questions/38576337/how-to-execute-a-bash-command-only-if-a-docker-container-with-a-given-name-does
'source' 카테고리의 다른 글
- SelectRowAtIndexPath: 호출되지 않음 (0) | 2023.04.22 |
---|---|
원래 GitHub 저장소에서 분기된 GitHub 저장소로 새 업데이트를 가져옵니다. (0) | 2023.04.22 |
필요한 경우에만 소수점을 표시하는 Excel 번호 형식 (0) | 2023.04.22 |
싱글 비트를 설정, 클리어 및 토글하려면 어떻게 해야 합니까? (0) | 2023.04.22 |
ASP란?NET Identity의 IUser Security Stamp Store 인터페이스 (0) | 2023.04.22 |