Подтвердить что ты не робот

Как сделать сборку обязательным во время сборки 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 ...

но, похоже, это не очень идиоматическое решение проблемы.

4b9b3361

Ответ 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)