试图了解我在PHP项目中发现的Dockerfile的这一点。
COPY composer.json composer.lock ./
RUN set -eux; \
composer install --prefer-dist --no-dev --no-autoloader --no-scripts --no-progress --no-suggest; \
composer clear-cache
COPY . ./
到目前为止,第1行和第2行复制了作曲家定义文件并运行composer install。
但是立即看来,所有项目文件(其中包括上述的作曲家定义文件)都被复制到相同的目标位置。
通过不运行composer install
之后可以得到什么。 COPY . ./
步?如果在主机composer install
上已经运行过,那岂不是会覆盖前两行所做的工作吗?
答案 0 :(得分:2)
当您尝试再次构建docker映像时,可以利用docker的缓存。 假设您有以下内容:
COPY . ./
RUN set -eux; \
composer install --prefer-dist --no-dev --no-autoloader --no-scripts --no-progress --no-suggest; \
composer clear-cache
这很好,最终结果将是相同的。区别在于,如果您更改存储库中的任何文件,那么COPY
中的所有指令将再次运行。这意味着,如果您进行了任何更改(例如,您添加了图像,更改了CSS文件或删除了php文件),即使您不需要,也将重新安装所有依赖项。 composer install
也将花费其(较长)时间。您可以节省的时间。
现在以您的示例为例:
COPY composer.json composer.lock ./
RUN set -eux; \
composer install --prefer-dist --no-dev --no-autoloader --no-scripts --no-progress --no-suggest; \
composer clear-cache
COPY . ./
现在,仅当composer.json
或composer.lock
更改时,才需要再次安装软件包。您不会每次都触发它。