gpt4 book ai didi

docker - 将Dockerfile分成两个图像

转载 作者:行者123 更新时间:2023-12-02 19:02:09 26 4
gpt4 key购买 nike

我有一个Dockerfile包括apache,进一步的安装和将我的代码复制到/ var / www / html以创建项目。在本地创建图像后,将其导出为.tar文件并将其上传到portainer。 Portainer是我的生产环境。但是,每次我要更新版本和使用我的软件的服务时,都必须更新整个新镜像,大小为800MB。 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

最佳答案

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

如果您没有其他使用基础镜像的使用者,则可能会造成混乱,并且只会增加更多开销来管理基础镜像和应用程序的版本,但这当然是可行的。

研究多阶段构建可能是值得的。
https://github.com/docker/docker.github.io/blob/master/develop/develop-images/multistage-build.md

If the objects on the file system that Docker is about to produce are unchanged between builds, reusing a cache of a previous build on the host is a great time-saver. It makes building a new container really, really fast.



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

我不确定你何时说

Then, for each Version update, I only have to upload the code



我可能对这句话有误解,但我建议在构建框中完成所有构建,然后将版本化的镜像推送到docker存储库中,以供生产框在准备好获取下一个版本时从中取出。您不需要将代码上传到任何地方。只是将构建的镜像存储到存储镜像的任何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

关于docker - 将Dockerfile分成两个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58416664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com