【问题标题】:Running composer install and then copying project files in a docker project运行 composer install 然后在 docker 项目中复制项目文件
【发布时间】:2019-03-05 20:46:01
【问题描述】:

试图理解我在一个 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 定义文件并运行 composer install,到目前为止一切顺利。

但立即似乎所有项目文件(包括上述作曲家定义文件)都被复制到同一个目的地。

之后不运行composer install可以获得什么。 COPY . ./ 一步?如果主机上的composer install已经运行了,那不会覆盖前两行所做的工作吗?

【问题讨论】:

    标签: docker composer-php dockerfile


    【解决方案1】:

    当您尝试再次构建 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.jsoncomposer.lock 更改时。你不会每次都触发它。

    【讨论】:

    • 在解释下来时似乎真的很愚蠢和明显。但是直到现在还真的看不出来。 :( 唯一剩下的疑问是我问题的第二部分:如果composer install 已经在主机上运行,​​那不会覆盖第一步的结果吗?看起来有点乱。
    • 您的意思是,您的主机上有一个vendor 文件夹,并使用COPY . ./ 将其复制到docker 映像上,覆盖之前的composer install?通常你有一个.dockerignorevendor 文件夹来防止这种情况发生
    猜你喜欢
    • 2018-03-25
    • 2017-10-30
    • 1970-01-01
    • 2016-12-13
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多