내 Docker 컨테이너가 존재하는지 먼저 확인하는 Makefile 대상을 만들려고 합니다. 존재하는 경우 Docker 컨테이너 다시 시작 명령을 실행하고, 그렇지 않으면 Docker Run 명령을 실행하여 컨테이너를 생성하고 시작하려고 합니다.
아래 코드를 작성했지만 아래와 같은 오류가 발생합니다. 컨테이너가 실행 중이므로 결과 = 1이 맞습니다. 컨테이너를 제거하고 결과가 0이 되는지 테스트했는데 이 역시 맞습니다. 문제는 ifeq
결과를 명령문에 사용하려고 할 때인 것 같습니다 . 누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있나요? (디버깅하는 동안 일시적으로 docker 명령을 주석 처리하고 echo true/false로 대체했습니다.)
start_docker_myapp:
result = $(shell (docker ps -a | grep myapp ) | wc -l )
ifeq (${result}, 1)
@echo 'true'
# docker restart ${IMAGE}
else
@echo 'false'
# docker run -v ${DIR}/var/log/docker:/var/log/myapp -p 1812:1812/udp -p 1813:1813/udp --detach --name ${IMAGE} $(REGISTRY)/$(IMAGE):$(TAG)
endif
터미널 출력
$ make start_docker_myapp result = 1 make: result: No such file or directory make: *** [start_docker_myapp] Error 1 $
답변1
Makefile에는 여러 가지 문제가 있습니다(Makefile이 적절한 솔루션인지 여부에 대한 질문 외에도).
- 조건부 지시문은 레시피의 일부가 아니므로 탭 문자로 시작할 수 없습니다.
- 조건부 지시문은 Makefile을 읽을 때 평가되므로 변수를 미리 할당해야 하며 대상별로 지정할 수 없습니다.
docker ps -a
실행되지 않는 컨테이너를 포함하여 알려진 모든 컨테이너에 대한 정보를 반환합니다.- 잘못된 목표는 그렇게 선언되어야 합니다.
다음은 작동합니다:
result = $(shell docker ps -f name=myapp -q | wc -l)
start_docker_myapp:
ifeq ($(strip $(result)),1)
@echo true
else
@echo false
endif
.PHONY: start_docker_myapp
답변2
대상 내에서 변수 값을 설정하려면 다음 eval
구문을 사용해야 합니다.
start_docker_myapp:
$(eval result = $(shell (docker ps -a | grep myapp ) | wc -l ))
@echo "result is " result
endif
또는 규칙 외부에서 이 변수를 평가할 수 있습니다.
result = $(shell (docker ps -a | grep myapp ) | wc -l )
start_docker_myapp:
@echo "result is " result
endif
답변3
에 통합하여 구현하는 것이 좋습니다 Makefile
.
grep
출력을 확인 하고 wc
숫자를 비교하는 대신 간단히 종료 코드를 확인하면 됩니다 .grep
# don't forget to declare start_docker_myapp as a phony target
.PHONY: start_docker_myapp
# Assuming you intended to use Make variables everywhere, I changed all ${VAR} to $(VAR).
# If your grep supports option -q you can use this instead of redirection to /dev/null.
start_docker_myapp:
if docker ps -a | grep myapp >/dev/null; \
then \
echo 'true'; \
# docker restart $(IMAGE); \
else \
echo 'false'; \
# docker run -v $(DIR)/var/log/docker:/var/log/myapp -p 1812:1812/udp -p 1813:1813/udp --detach --name $(IMAGE) $(REGISTRY)/$(IMAGE):$(TAG); \
fi
또는 대신 부울 연산자를 사용하십시오.if...then...
.PHONY: start_docker_myapp
start_docker_myapp:
docker ps -a | grep myapp >/dev/null && docker restart $(IMAGE) || docker run -v $(DIR)/var/log/docker:/var/log/myapp -p 1812:1812/udp -p 1813:1813/udp --detach --name $(IMAGE) $(REGISTRY)/$(IMAGE):$(TAG)