Makefile - 해당 파일이나 디렉터리 오류가 없습니다.

Makefile - 해당 파일이나 디렉터리 오류가 없습니다.

내 Docker 컨테이너가 존재하는지 먼저 확인하는 Makefile 대상을 생성하려고 합니다. 존재하는 경우 Docker Container Restart 명령을 실행하고, 그렇지 않으면 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.

grepwith 의 출력을 확인 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)

관련 정보