Спробували інші ідеї, але жодна не відповідала нашій вимозі. Ідея полягає у створенні базового зображення 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.