Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在docker中仅重建代码_Docker_Dockerfile - Fatal编程技术网

在docker中仅重建代码

在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/

我有一个相当大的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/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安装”之前,我复制了除文件夹“控制器”、“模型”、“视图”之外的所有内容。作为最后一步,我复制了这三个文件夹-现在它在更改后可以快速构建,非常感谢您的帮助!