在docker中仅重建代码
我有一个相当大的yii2应用程序,它需要几分钟在docker中构建。有没有一种方法可以只构建代码,而不必每次“重新安装”所有内容?如何加快开发/调试停靠的yii2应用程序 现在我这样做: docker构建-t myapp:mytag。 docker run--名称myapp-p 8000:8000 myapp:mytag 我的Dockerfile:在docker中仅重建代码,docker,dockerfile,Docker,Dockerfile,我有一个相当大的yii2应用程序,它需要几分钟在docker中构建。有没有一种方法可以只构建代码,而不必每次“重新安装”所有内容?如何加快开发/调试停靠的yii2应用程序 现在我这样做: docker构建-t myapp:mytag。 docker run--名称myapp-p 8000:8000 myapp:mytag 我的Dockerfile: FROM php:5.6-apache COPY . /var/www/html/ ENV APACHE_DOCUMENT_ROOT /var/
FROM php:5.6-apache
COPY . /var/www/html/
ENV APACHE_DOCUMENT_ROOT /var/www/html/web
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
RUN apt-get update && \
apt-get install -y curl nano unzip zlib1g-dev git && \
docker-php-ext-install pdo pdo_mysql zip && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN cd /var/www/html && composer install
RUN cd /var/www/html/ && mkdir web/assets/
RUN chmod 777 /var/www/html/web/assets/
RUN mv /var/www/html/vendor/bower-asset/ /var/www/html/vendor/bower/
Docker将重用以前执行过且未更改的缓存构建步骤。但是,一旦到达中断缓存的步骤,所有后续步骤都必须重新运行,因为缓存包含对上一步骤的依赖关系。因此,缓存取决于顺序,您首先要做的步骤之一是:
COPY . /var/www/html/
每次更改代码时,该行都必须重新运行,这将迫使apt get
行也重新运行。通过重新安排安装顺序,您将看到一个巨大的速度提升:
FROM php:5.6-apache
ENV APACHE_DOCUMENT_ROOT /var/www/html/web
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
RUN apt-get update && \
apt-get install -y curl nano unzip zlib1g-dev git && \
docker-php-ext-install pdo pdo_mysql zip && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# move this line to as late in the build as possible
COPY . /var/www/html/
RUN cd /var/www/html && composer install
RUN cd /var/www/html/ && mkdir web/assets/
RUN chmod 777 /var/www/html/web/assets/
RUN mv /var/www/html/vendor/bower-asset/ /var/www/html/vendor/bower/
只需创建一个基本映像,在其中安装所需的所有内容。然后你使用一个独立的映像,它取决于你的基本映像,只添加你的代码在我的例子中,我只使用调试和测试阶段的代码目录选项,这样我就不需要重建映像,我只需要修复代码,然后重新运行,不需要任何额外的步骤。然后,当我需要释放映像时,我构建整个映像,包括代码目录。
docker
运行COPY
命令时是否检测代码是否更改,即使没有任何更改Dockerfile
?@SangminKim它使用文件内容的散列来检测更改。因此,即使不更改Dockerfile,docker也会知道如何重新运行COPY
命令。如果要运行curl…>external file.txt
因为docker只查看命令,而不是命令外部依赖的所有内容。注意:我做了一点欺骗:在“运行cd/var/www/html&&composer安装”之前,我复制了除文件夹“控制器”、“模型”、“视图”之外的所有内容。作为最后一步,我复制了这三个文件夹-现在它在更改后可以快速构建,非常感谢您的帮助!