Ошибка Makefile при создании образа Docker

#linux #docker #makefile #gnu-make

#linux #docker #makefile #gnu-make

Вопрос:

Я пытаюсь создать образ Docker, используя Makefile и следуя содержимому моего Makefile

 NAME   := bluehubs/bluehubs
TAG    := $(shell git log -1 --pretty=%H)
IMG    := ${NAME}:${TAG}
LATEST := ${NAME}:latest

build:
    $(info $$IMG is [${IMG}])
    $(info $$LATEST is [${LATEST}])
    docker build -t ${IMG} .
  

выдает ошибку, как показано ниже:

 $IMG is [bluehubs/bluehubs:9e8c3566e19cc86fb74b246dee86421a3f6d32bc]
$LATEST is [bluehubs/bluehubs:latest]
make: *** No rule to make target '9e8c3566e19cc86fb74b246dee86421a3f6d32bc', needed by 'build'.  Stop.
  

Ответ №1:

Вероятно, команды для вашей цели make build: имеют отступ не с Tab, а с пробелами. Это распространенная ошибка с Makefiles, но в этом особом случае сообщение об ошибке выглядит немного странно.

Строки

 $(info ...)
  

кажется, работает при отступе пробелами, но строка

 docker build -t ${IMG} .
  

который не имеет правильного отступа, расширяется до

 docker build -t bluehubs/bluehubs:9e8c3566e19cc86fb74b246dee86421a3f6d32bc .
  

что приводит к правилу, которое определяет целевые объекты docker , build -t и bluehubs/bluehubs , от 9e8c3566e19cc86fb74b246dee86421a3f6d32bc которых будет зависеть и .

Поскольку build это ваша цель по умолчанию, make проверяется ее зависимость 9e8c3566e19cc86fb74b246dee86421a3f6d32bc , которая не найдена.

Чтобы устранить проблему, вы должны убедиться, что каждая строка в рецепте, то есть команды для выполнения, должны начинаться с Tab символа.

Не имеет значения, есть ли у вас пробелы после a Tab, но вы должны использовать редактор, в котором есть специальный режим для Makefile-файлов или который, по крайней мере, показывает, есть ли в строке отступ с пробелами или с Tab.

Чтобы избежать ошибок в Makefile, я рекомендую вообще не использовать пробелы для отступов.

Комментарии:

1. Спасибо @Bodo за объяснение ошибки, я также попытался указать ее с помощью 4 пробелов вручную, но, тем не менее, она выдает ту же ошибку. Есть предложения о том, как я могу заставить его работать?

2. Я думаю, вы неправильно истолковали ответ. В рецепте makefile строки (команды, которые выполняются) должны иметь отступ с символом ТАБУЛЯЦИИ. Не 4 пробела, не 8 пробелов, а один символ ТАБУЛЯЦИИ. Вы должны убедиться, что ваш текстовый редактор не заменяет ваш символ ТАБУЛЯЦИИ 8 пробелами, а фактически помещает табуляцию в ваш файл.

3. Цитирую руководство : «Каждая строка в рецепте должна начинаться с табуляции …». Я бы посоветовал использовать редактор с режимом makefile, который будет помечать строки рецепта с неправильным отступом.