Разделите Dockerfile на два изображения - PullRequest
1 голос
/ 16 октября 2019

У меня есть Dockerfile, включающий, например, apache, дополнительные установки и мой код, который копируется в / var / www / html для создания проекта. После того, как я создал изображение локально, я экспортирую его как файл .tar и загружаю изображение в Portainer. Portainer - моя производительная среда. Однако каждый раз, когда я хочу обновить версию и службы, использующие мое программное обеспечение, мне приходится обновлять весь новый образ размером 800 МБ. Кроме того, в Portainer есть несколько менеджеров, поэтому мне приходится загружать их каждому менеджеру.

Поскольку все остается неизменным, за исключением моего кода, который вставляется копирующей частью COPY HRmAppBare/ /var/www/html, я подумал об этой идее,Если это возможно, чтобы создать два изображения. Один образ для всей установки (скажем, 1.0-BaseInstall) и второй образ (скажем, 1.9-бэкэнд), в котором хранится только мой код. Затем для каждого обновления версии мне нужно только загрузить изображение с новым кодом и, может быть, каким-то образом сослаться на 1.0-BaseInstall, например, From 1.0-BaseInstall. Если BaseInstall изменится (что действительно редко), я мог бы просто создать новый образ для этого.

Поскольку я не смог ничего найти по этому поводу, я хочу знать, применим ли этот подход и если да,как мне это построить?

#start with base Image from php 
FROM php:7.3-apache

#install system dependencies and enable PHP modules

RUN apt-get update && apt-get install -y \
      libicu-dev \
      vim \
      cron \
      libpq-dev \
      libmcrypt-dev \
      default-mysql-client \
      zip \
      unzip \
      libzip-dev \
    && docker-php-ext-configure zip --with-libzip \
    && docker-php-ext-install zip \
    && rm -r /var/lib/apt/lists/* \
    && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
    && docker-php-ext-install \
      intl \
      mbstring \
      pcntl \
      pdo_mysql \
      opcache \
      gettext \
        && pecl install mcrypt-1.0.2 \
        && docker-php-ext-enable mcrypt \
        && rm -rf /var/lib/apt/lists/*

#configure imap for mails
RUN apt-get update && \
    apt-get install -y \
    libc-client-dev libkrb5-dev && \
    rm -r /var/lib/apt/lists/*

RUN docker-php-ext-configure imap --with-kerberos --with-imap-ssl && \
docker-php-ext-install -j$(nproc) imap

#install composer
#RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer

#change uid and gid of apache to docker user uid/gid, enable apache module rewrite
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data && a2enmod rewrite

#copy the source code (Can this be in a 2nd image?)
COPY HRmAppBare/ /var/www/html

#Update apache2.conf
RUN   echo 'Alias ${COOKIE_PATH} "/var/www/html"' >> /etc/apache2/apache2.conf
RUN   echo 'Alias ${COOKIE_PATH}/ "/var/www/html/"' >> /etc/apache2/apache2.conf

#change ownership of our applications
RUN chown -R www-data:www-data /var/www/html/

ENTRYPOINT [ "sh", "-c", "rm /var/www/html/app/tmp/cache/models/* && rm /var/www/html/app/tmp/cache/persistent/* && /var/www/html/app/Console/cake schema update -y && apache2-foreground"]

EXPOSE 80

1 Ответ

2 голосов
/ 16 октября 2019

Вы можете разбить это на несколько файлов Docker, и это будет жизнеспособным.

Если у вас нет других потребителей базового образа, это может создать путаницу и просто добавить дополнительные накладные расходы для управления версиями вашего базового образа и вашего приложения, но это, безусловно, жизнеспособно.

Возможно, стоит взглянуть на многоэтапные сборки. https://github.com/docker/docker.github.io/blob/master/develop/develop-images/multistage-build.md

Если объекты в файловой системе, которую собирается создать Docker, не меняются между сборками, повторное использование кэша предыдущей сборки на хосте - это большая экономия времени. Это делает создание нового контейнера действительно, очень быстрым.

https://thenewstack.io/understanding-the-docker-cache-for-faster-builds/

Я не уверен, когда вы говорите

Тогда для каждой версииОбновление, мне нужно только загрузить код

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

Редактировать: Добавить ссылку для создания собственного репозитория Docker https://docs.docker.com/registry/deploying/

Редактировать 2: Чтобы лучше ответить на ваш вопрос

FROM php:7.3-apache AS base
//...rest of your dockerfile until copy

FROM base
#copy the source code (Can this be in a 2nd image?)
COPY HRmAppBare/ /var/www/html

#Update apache2.conf
RUN   echo 'Alias ${COOKIE_PATH} "/var/www/html"' >> /etc/apache2/apache2.conf
RUN   echo 'Alias ${COOKIE_PATH}/ "/var/www/html/"' >> /etc/apache2/apache2.conf

#change ownership of our applications
RUN chown -R www-data:www-data /var/www/html/

ENTRYPOINT [ "sh", "-c", "rm /var/www/html/app/tmp/cache/models/* && rm /var/www/html/app/tmp/cache/persistent/* && /var/www/html/app/Console/cake schema update -y && apache2-foreground"]

EXPOSE
...