#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, который будет помечать строки рецепта с неправильным отступом.