Makefile - nenhum erro de arquivo ou diretório

Makefile - nenhum erro de arquivo ou diretório

Estou tentando criar um destino Makefile que primeiro verifica se meu contêiner Docker existe. Se existir, desejo emitir o comando Docker Container Restart, caso contrário, desejo emitir o comando Docker Run para criar e iniciar o contêiner.

Codifiquei o abaixo, mas estou recebendo o erro mostrado abaixo. O resultado = 1 está correto porque tenho um contêiner em execução. Eu removi o contêiner e testei que o resultado se torna 0, o que também está correto. O problema parece ser quando tento usar o resultado na ifeqinstrução. Alguém pode me aconselhar o que estou fazendo de errado? (Comentei temporariamente os comandos do docker e os substituí por echo true/false apenas enquanto estou depurando).

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

Saída do Terminal

$ make start_docker_myapp
result =        1
make: result: No such file or directory
make: *** [start_docker_myapp] Error 1
$

Responder1

Existem vários problemas com o seu Makefile (além da questão de saber se um Makefile é a solução apropriada):

  • as diretivas condicionais não fazem parte de uma receita, portanto não devem começar com uma guia;
  • as diretivas condicionais são avaliadas à medida que o Makefile é lido, portanto as variáveis ​​devem ser atribuídas previamente e não podem ser específicas do alvo;
  • docker ps -aretorna informações sobre todos os contêineres conhecidos, incluindo contêineres que não estão em execução;
  • alvos falsos devem ser declarados como tal.

Os seguintes trabalhos:

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

Responder2

Para definir um valor de variável dentro de um destino, você deve usar a evalsintaxe:

start_docker_myapp:
    $(eval result = $(shell (docker ps -a | grep myapp ) | wc -l ))
    @echo "result is " result
    endif

Alternativamente, você pode avaliar esta variável fora de uma regra:

result = $(shell (docker ps -a | grep myapp ) | wc -l )

start_docker_myapp:        
    @echo "result is " result
    endif

Responder3

Em vez de implementar uma mistura de código de script de shell e variáveis ​​make, sugiro implementar isso como um script de shell puro integrado no arquivo Makefile.

Em vez de verificar a saída de grepwith wce comparar o número, você pode simplesmente verificar grepo código de saída de.

# 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

Ou com operadores booleanos em vez deif...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)

informação relacionada