Как сделать сборку обязательным во время сборки Docker?
Есть ли способ сделать аргумент сборки обязательным во время docker build
? Ожидаемое поведение было бы для сбоя сборки, если аргумент отсутствует.
Например, для следующего файла Docker:
FROM ubuntu
ARG MY_VARIABLE
ENV MY_VARIABLE $MY_VARIABLE
RUN ...
Я хотел бы, чтобы сборка завершилась с ошибкой ARG MY_VARIABLE
при построении с помощью docker build -t my-tag .
и передана при построении с помощью docker build -t my-tag --build-arg MY_VARIABLE=my_value .
.
Есть ли способ достичь такого поведения? Установка значения по умолчанию на самом деле не делает трюк в моем случае.
(Я запускаю Docker 1.11.1
on darwin/amd64
.)
ИЗМЕНИТЬ:
Один из способов сделать то, что я могу придумать, - запустить команду, которая терпит неудачу, когда MY_VARIABLE
пуст, например:
FROM ubuntu
ARG MY_VARIABLE
RUN test -n "$MY_VARIABLE"
ENV MY_VARIABLE $MY_VARIABLE
RUN ...
но, похоже, это не очень идиоматическое решение проблемы.
Ответы
Ответ 1
Я протестировал с RUN test -n <ARGvariablename>
то, что @konradstrack упомянул в исходном (редактируемом) посте... которое, похоже, выполняет задачу по передаче переменной, передаваемой в качестве аргумента времени сборки для команды docker build
:
FROM ubuntu
ARG MY_VARIABLE
RUN test -n "$MY_VARIABLE"
ENV MY_VARIABLE $MY_VARIABLE
Ответ 2
Вы также можете использовать расширение параметров оболочки для достижения этой цели.
Допустим, ваш обязательный аргумент сборки называется MANDATORY_BUILD_ARGUMENT
, и вы хотите, чтобы он был установлен и не был пустым, ваш файл Docker может выглядеть следующим образом:
FROM debian:stretch-slim
MAINTAINER Evel Knievel <[email protected]>
ARG MANDATORY_BUILD_ARGUMENT
RUN \
# Check for mandatory build arguments
: "${MANDATORY_BUILD_ARGUMENT:?Build argument needs to be set and non-empty.}" \
# Install libraries
&& apt-get update \
&& apt-get install -y \
cowsay \
fortune \
# Cleanup
&& apt-get clean \
&& rm -rf \
/var/lib/apt/lists/* \
/var/tmp/* \
/tmp/* \
CMD ["/bin/bash", "-c", "/usr/games/fortune | /usr/games/cowsay"]
Конечно, вы также захотите использовать аргумент сборки для чего-то другого, в отличие от меня, но все же я рекомендую собрать этот Dockerfile и взять его для тестового запуска :)
Ответ 3
Вы можете сделать что-то вроде этого...
FROM ubuntu:14.04
ONBUILD ARG MY_VARIABLE
ONBUILD RUN if [ -z "$MY_VARIABLE" ]; then echo "NOT SET - ERROR"; exit 1; else : ; fi
Тогда docker build -t my_variable_base .
Затем создайте свои изображения на основе этого...
FROM my_variable_base
...
Это не очень чисто, но, по крайней мере, он абстрагирует материал "bleh" от базового изображения.
Ответ 4
Я пока не могу комментировать, потому что у меня нет 50 репутации, но я бы хотел добавить решение @Jan Nash, потому что мне было немного трудно заставить его работать с моим изображением.
Если вы скопируете/вставите решение @Jan Nash, оно сработает и выдаст сообщение об ошибке, что аргумент сборки не указан.
Что я хочу добавить
Когда я попытался заставить его работать с изображением CentOS 7 (centos: 7), Докер запустил команду RUN
без ошибки.
Решение
Убедитесь, что вы выполняете команду RUN
с оболочкой bash.
RUN ["/bin/bash", "-c", ": ${MYUID:?Build argument needs to be set and not null.}"]
Я надеюсь, что это поможет будущим приходящим людям. В противном случае, я считаю, что решение @Jan Nash просто великолепно.
Ответ 5
Еще один простой способ:
RUN test -n "$MY_VARIABLE" || (echo "MY_VARIABLE not set" && false)