На данный момент условное выполнение в 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.