Wypróbowałem inne pomysły, ale żaden nie spełnił naszych wymagań. Pomysł polega na utworzeniu podstawowego obrazu nginx dla podrzędnych statycznych aplikacji internetowych. Ze względów bezpieczeństwa, optymalizacji i standaryzacji obraz podstawowy musi umożliwiać RUN
polecenia dotyczące katalogów dodanych przez obrazy potomne. Obraz podstawowy nie kontroluje, które katalogi są dodawane przez obrazy podrzędne. Zakłada się, że obrazy potomne będą COPY
znajdowały się gdzieś pod COMMON_DEST_ROOT
.
To podejście to hack, ale idea jest taka, że obraz podstawowy będzie obsługiwał COPY
instrukcje dla katalogów od 1 do N dodanych przez obraz potomny. ARG PLACEHOLDER_FILE
i ENV UNPROVIDED_DEST
są wykorzystywane w celu zaspokojenia <src>
i <dest>
wymagania dla każdej COPY
nie potrzeba instrukcji.
#
# 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
To rozwiązanie ma oczywiste wady, takie jak fikcyjna PLACEHOLDER_FILE
i zakodowana na stałe liczba obsługiwanych instrukcji COPY. Nie ma również sposobu na pozbycie się zmiennych ENV, które są używane w instrukcji COPY.