Как создать гибкое изображение докеры onbuild, использующее env vars?

У меня есть базовое onbuild tagged docker image, которое я хотел бы использовать в качестве шаблона для сборки, но я хочу, чтобы дочерний образ мог установить ENV var для изменения инструкций ONBUILD

база-onbuild:

 FROM root-image RUN mkdir -p /app/src UNBUILD COPY . /app/src/ ONBUILD WORKDIR /app/src ONBUILD RUN ./build ${TARGET_APP} ONBUILD RUN cp ${TARGET_APP}/build/bin /app/bin 

мое-приложение:

 FROM base-onbuild ENV TARGET_APP my-app CMD my-app 

Согласно документации ONBUILD шаги ONBUILD запускаются сразу же после предложения FROM base-onbuild , поэтому перед оператором ENV который устанавливает TARGET_APP так что в шагах TARGET_APP не установлен.

Я также попытался передать значение TARGET_APP помощью аргумента --build-args docker build но это также не имело никакого эффекта.

Есть ли другой способ, которым я могу установить переменные и изменить шаги UNBUILD ?

аналогичный вопрос: поле «Заполнитель» для раздела ONBUILD для изображений дочерних докеров

Обязательный аргумент

У меня есть что-то, что подходит для вашего вопроса, но оно не будет работать для всех случаев в целом.

В вашем файле докеров после ONBUILD WORKDIR /app/src вас будет:

 COPY build_copy.sh /config ONBUILD COPY target_app.txt /config ONBUILD RUN sh /config/build_copy.sh 

Файл build_copy.sh будет содержать следующие строки:

 TARGET_APP=`cat /config/target_app.txt` ONBUILD RUN ./build $TARGET_APP ONBUILD RUN cp $TARGET_APP/build/bin /app/bin 

Файл target_app.txt должен содержать текст, который вы хотите поместить в TARGET_APP. Это потребует наличия файла target_app.txt в вашем дочернем образе.


Дополнительно arg

Вы можете немного смягчить это, добавив «необязательные» текстовые файлы в папку / config в корневой каталог вашего ребенка и изменив свой ONBUILD на:

 ONBUILD COPY /config /config 

Вам понадобится только папка, все файлы там будут необязательными. Сценарий оболочки затем может использовать:

 TARGET_APP_2=`cat /config/target_app.txt` if [ -n "$TARGET_APP_2" ] then TARGET_APP=$TARGET_APP_2 else TARGET_APP='default_app' fi