Пробовали другие идеи, но ни одна не соответствовала нашим требованиям. Идея состоит в том, чтобы создать базовый образ nginx для дочерних статических веб-приложений. По соображениям безопасности, оптимизации и стандартизации базовый образ должен иметь возможность выполнять RUNкоманды в каталогах, добавленных дочерними образами. Базовое изображение не определяет, какие каталоги добавляются дочерними изображениями. Предполагается, что дочерние изображения будут COPYгде-то под ресурсами COMMON_DEST_ROOT.
Этот подход является взломом, но идея состоит в том, что базовый образ будет поддерживать COPYинструкции для каталогов от 1 до N, добавленных дочерним изображением. ARG PLACEHOLDER_FILEи ENV UNPROVIDED_DESTиспользуются для удовлетворения <src>и <dest>требования к любой COPYинструкции не требуется.
#
# base-image:01
#
FROM nginx:1.17.3-alpine
ENV UNPROVIDED_DEST=/unprovided
ENV COMMON_DEST_ROOT=/usr/share/nginx/html
ONBUILD ARG PLACEHOLDER_FILE
ONBUILD ARG SRC_1
ONBUILD ARG DEST_1
ONBUILD ARG SRC_2
ONBUILD ARG DEST_2
ONBUILD ENV SRC_1=${SRC_1:-PLACEHOLDER_FILE}
ONBUILD ENV DEST_1=${DEST_1:-${UNPROVIDED_DEST}}
ONBUILD ENV SRC_2=${SRC_2:-PLACEHOLDER_FILE}
ONBUILD ENV DEST_2=${DEST_2:-${UNPROVIDED_DEST}}
ONBUILD COPY ${SRC_1} ${DEST_1}
ONBUILD COPY ${SRC_2} ${DEST_2}
ONBUILD RUN sh -x \
#
# perform operations on COMMON_DEST_ROOT
#
&& chown -R limited:limited ${COMMON_DEST_ROOT} \
#
# remove the unprovided dest
#
&& rm -rf ${UNPROVIDED_DEST}
#
# child image
#
ARG PLACEHOLDER_FILE=dummy_placeholder.txt
ARG SRC_1=app/html
ARG DEST_1=/usr/share/nginx/html/myapp
FROM base-image:01
У этого решения есть очевидные недостатки, такие как фиктивное PLACEHOLDER_FILEи жестко запрограммированное количество поддерживаемых инструкций COPY. Также нет способа избавиться от переменных ENV, которые используются в инструкции COPY.