Условные выражения в dockerfile? - PullRequest
0 голосов
/ 31 октября 2019

Можно ли сделать следующее

docker build --build-arg myvar=yes

f

RUN if ["$myvar" == "yes"]; \
    then FROM openjdk \
          COPY . . \
          RUN java -jar myjarfile.jar \
    fi

Как вы можете сказать выше, я хочу запускать только определенный раздел в файле Docker, если аргумент сборкиустановлено. Я видел похожие темы, но они, кажется, всегда запускают команды bash. Если это возможно, я не могу получить правильный синтаксис.

1 Ответ

0 голосов
/ 31 октября 2019

На данный момент условное выполнение в Dockerfiles без помощи оболочки строго ограничено, см. https://medium.com/@tonistiigi/advanced-multi-stage-build-patterns-6f741b852fae

Идея существующих подходов состоит в том, чтобы использовать многоступенчатую сборку Docker и создавать различные этапы дляразличные результаты IF. Затем в какой-то момент выбирается этап для копирования данных на основе значения переменной.

Это пример, аналогичный тому, что вы написали:

# docker build -t test --build-arg MYVAR=yes .
# docker build -t test --build-arg MYVAR=no .

ARG MYVAR=no

FROM openjdk:latest as myvar-yes
COPY . /datadir
RUN java -jar /datadir/myjarfile.jar || true

FROM openjdk:latest as myvar-no
RUN mkdir /datadir

FROM myvar-${MYVAR} as myvar-src

FROM debian:10
COPY --from=myvar-src /datadir/ /
RUN ls /

Этап myvar-no вариант с пустым /datadir. Этап myvar-yes содержит файл jar и запускает его один раз (удалите || true для фактического использования, просто я не предоставил «настоящий» файл jar в моих локальных тестах). Затем последняя стадия копируется со стадии myvar-${MYVAR} и вызывает ls, чтобы увидеть различия между этими двумя вариантами.

Я не понимаю всего вопроса о синтаксисе: если есть некоторые проблемыс правильным получением синтаксиса bash, это, возможно, проще, чем попытка условно выполнить операторы Dockerfile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...