Как сделать сборку arg обязательной при сборке Docker?

docker

9070 просмотра

5 ответа

1761 Репутация автора

Есть ли способ сделать аргумент сборки обязательным во время docker build? Ожидаемое поведение будет для сбоя сборки, если аргумент отсутствует.

Например, для следующего Dockerfile:

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на darwin/amd64.)

РЕДАКТИРОВАТЬ : Один из способов сделать, что я могу придумать, это запустить команду, которая не работает, когда MY_VARIABLEпусто, например:

FROM ubuntu

ARG MY_VARIABLE
RUN test -n "$MY_VARIABLE"
ENV MY_VARIABLE $MY_VARIABLE

RUN ...

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

Автор: konradstrack Источник Размещён: 18.07.2016 02:11

Ответы (5)


9 плюса

8598 Репутация автора

Вы могли бы сделать что-то вроде этого ...

 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" от основного изображения.

Автор: johnharris85 Размещён: 18.07.2016 03:12

30 плюса

324 Репутация автора

Я проверил RUN test -n <ARGvariablename>то, что @konradstrack упомянул в исходном (редактируемом) посте ... которое, похоже, выполняет задачу передачи переменной в качестве аргумента времени сборки для docker buildкоманды:

FROM ubuntu

ARG MY_VARIABLE
RUN test -n "$MY_VARIABLE"
ENV MY_VARIABLE $MY_VARIABLE
Автор: KarthiS Размещён: 09.02.2017 06:14

18 плюса

1163 Репутация автора

Вы также можете использовать расширение параметров оболочки для достижения этой цели.

Допустим, ваш обязательный аргумент сборки вызван MANDATORY_BUILD_ARGUMENT, и вы хотите, чтобы он был установлен и не был пустым, ваш Dockerfile может выглядеть так:

FROM debian:stretch-slim
MAINTAINER Evel Knievel <evel@kniev.el>

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 и взять его для тестового запуска :)

Автор: Jan Nash Размещён: 27.06.2017 11:02

4 плюса

113 Репутация автора

Я пока не могу комментировать, потому что у меня нет 50 репутации, но я бы хотел добавить решение @Jan Nash, потому что мне было немного трудно заставить его работать с моим изображением.

Если вы скопируете / вставите решение @Jan Nash, оно сработает и выдаст сообщение об ошибке, что аргумент сборки не указан.

Что я хочу добавить

Когда я попытался заставить его работать с образом CentOS 7 (centos: 7), Docker выполнил RUNкоманду без ошибок.

Решение

Убедитесь, что вы выполняете RUNкоманду с оболочкой bash.

RUN ["/bin/bash", "-c", ": ${MYUID:?Build argument needs to be set and not null.}"]

Я надеюсь, что это поможет будущим приходящим людям. В противном случае, я считаю, что решение @Jan Nash просто блестящее.

Автор: Jeffrey Wen Размещён: 10.07.2018 06:02

6 плюса

71 Репутация автора

Еще один простой способ:

RUN test -n "$MY_VARIABLE" || (echo "MY_VARIABLE  not set" && false)
Автор: memsetzero Размещён: 15.02.2019 03:10
Вопросы из категории :
32x32