将Dockerfile拆分为两个图像

将Dockerfile拆分为两个图像,docker,portainer,Docker,Portainer,我有一个Dockerfile,包括apache、进一步的安装和我的代码,这些代码被复制到/var/www/html以创建一个项目。在本地创建图像后,我将其导出为.tar文件并将图像上载到portainer。Portainer是我的生产环境。然而,每当我想更新使用我的软件的版本和服务时,我必须更新整个新映像,它的大小为800MB。Portainer还有多个管理器,这导致我必须将其上载到每个管理器 因为除了复制部分插入的代码之外,所有内容都是一样的,所以我考虑了这个想法,如果可以创建两个图像的话。一

我有一个Dockerfile,包括apache、进一步的安装和我的代码,这些代码被复制到/var/www/html以创建一个项目。在本地创建图像后,我将其导出为.tar文件并将图像上载到portainer。Portainer是我的生产环境。然而,每当我想更新使用我的软件的版本和服务时,我必须更新整个新映像,它的大小为800MB。Portainer还有多个管理器,这导致我必须将其上载到每个管理器

因为除了复制部分插入的代码之外,所有内容都是一样的,所以我考虑了这个想法,如果可以创建两个图像的话。一个映像用于整个安装(假设为:1.0-BaseInstall),另一个映像(假设为:1.9-backend)仅存储我的代码。然后,对于每个版本更新,我只需要上传带有新代码的图像,并且可能会以某种方式引用1.0-BaseInstall,例如从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

您可以将其分解为多个docker文件,这是可行的

如果您没有基础映像的其他使用者,则可能会造成混乱,并增加管理基础映像和应用程序版本的开销,但这肯定是可行的

研究多阶段构建可能是值得的。

如果Docker将要生成的文件系统上的对象在构建之间保持不变,那么在主机上重用上一个构建的缓存将大大节省时间。这使得构建一个新容器非常非常快

我不确定你说什么

然后,对于每个版本更新,我只需要上传代码

我可能误解了这句话,但我建议在构建框上完成所有构建,并将版本化映像推送到docker repo,以便在准备获取下一个版本时从生产框中取出。你不需要在任何地方上传你的代码。只需将构建的图像保存到存储图像的docker repo上即可

编辑:用于创建自己的docker repo的加载项链接

编辑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

我有不同的应用程序可以使用基本图像。我有一个错误的想法,即第二个图像将减少时,只是出口这个分裂。但我可以导入第一个图像,然后在portainer上运行第二部分并给出提示。然后,我将只从存储库获取代码,而不是从本地机器复制代码。