2

我有一个 Dockerfile,包括例如 apache、进一步的安装和我复制到 /var/www/html 以创建项目的代码。在本地创建图像后,我将其导出为 .tar 文件并将图像上传到 portainer。Portainer 是我的生产环境。但是,每次我想更新版本和正在使用我的软件的服务时,我都必须更新大小为 800MB 的全新镜像。Portainer 还有多个经理,这导致我必须将其上传给每个经理。

因为一切都保持不变,除了我的复制部分插入的代码COPY HRmAppBare/ /var/www/html,我想到了这个想法,如果可以创建两个图像。整个安装的一个映像(假设:1.0-BaseInstall)和仅存储我的代码的第二个映像(假设:1.9-backend)。然后,对于每个版本更新,我只需上传带有新代码的图像,并且可以以某种方式引用 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
4

1 回答 1

2

您可以将其分解为多个 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 repo 以便您的生产盒在您准备好获取下一个版本时从中提取。您不需要在任何地方上传您的代码。只是构建的图像到您存储图像的任何 docker repo。

编辑:添加链接以创建您自己的 docker repo 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
于 2019-10-16T16:16:15.350 回答