Пробовали другие идеи, но ни одна не соответствовала нашим требованиям. Идея состоит в том, чтобы создать базовый образ 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.