Как написать многоэтапный Dockerfile, чтобы он перестраивался при изменениях в git? - PullRequest
0 голосов
/ 13 февраля 2019

Я создал образ докера, который используется для размещения моих статических файлов для разных, но связанных сайтов.

Файл Docker выглядит следующим образом

FROM node:8 as builder
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
RUN apt-get update
RUN apt-get install -y apt-utils libapt-inst2.0 moreutils rsync libunwind-dev

RUN wget -O azcopy.tar.gz https://aka.ms/downloadazcopylinux64
RUN tar -xf azcopy.tar.gz
RUN ./install.sh

RUN mkdir -p /opt/myproject
RUN mkdir -p /var/www/adminapp/
RUN mkdir -p /var/www/app
RUN mkdir -p /var/www/publicsite
WORKDIR /opt/myproject
ADD ./deploy-scripts /opt/myproject
RUN ./deployAdminApp.sh ./deploy.config.json  -m setup
RUN ./deployApp.sh ./deploy.config.json -m setup
RUN ./deployPublicSite.sh ./deploy.config.json -m setup


FROM nginx:alpine as nginx
## Remove default nginx website
RUN rm -rf /usr/share/nginx/html/*
ADD ./nginx /etc/nginx/
ADD .htpasswd /etc/nginx/.htpasswd
ADD ./ssl /etc/ssl
COPY --from=builder /var/www/ /var/www/
RUN ln -s /etc/nginx/sites-available/mysite.com /etc/nginx/sites-enabled/mysite.com
RUN ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default

EXPOSE 80
EXPOSE 443
CMD nginx -g "daemon off;"

У меня есть три сценария развертывания, которыевыполняются в моем «образе сборки», deployAdminApp.sh, deployApp.sh и deployPublicSite.sh Каждый из этих сценариев извлекает код из Github, создает угловое приложение, загружает ресурсы в CDN и затем перемещает папку dist в /var/www/<relevant folder>, который я затем копирую в мое изображение nginx.Этот процесс сборки занимает около 10-15 минут для каждого приложения, поэтому вся сборка с нуля занимает около 30-45 минут.

Мне интересно, есть ли способ для меня структурировать Dockerfile так, чтобы он могобнаруживать, есть ли изменения файла, когда он извлекает код из Github, и создавать этот слой, только если есть изменения в исходных файлах.

С другой стороны, есть ли способ для Docker распознать, чтофайлы в папке dist в образе компоновщика изменились, и поэтому заново скопируйте эти файлы в образ nginx без необходимости вручную изменять порядок команд RUN?

В настоящее время я должен изменитьпорядок вызовов трех сценариев для принудительной перестройки кода приложения, и когда я это делаю, он перестраивает все из них.Поэтому я либо собираю все, либо ничего, и мне приходится вручную проверять репозиторий GitHub, чтобы определить, следует ли мне все строить.

...