これについてはよくわかりませんが、ワイルドカードを使用してファイルをコピーすると、docker レイヤーのキャッシュが壊れることに気付きました。次のビルド コンテキストを参照してください。
問題は、Kernel.phpを変更(スペースなどを追加) してdocker build
再度実行すると、composer データが変更されていなくても、「copy composer.*」の後のレイヤーが毎回再実行されることです...
ファーストラン
=> [1/6] FROM docker.io/library/composer
=> [2/6] RUN set -eux; composer global require hira
=> [3/6] COPY composer.* ./
=> [4/6] RUN set -eux; composer install --i
=> [5/6] COPY app/ /app/app/
=> [6/6] RUN set -eux; composer dump-autoload ...
編集Kernel.php
して再度実行します:
=> [1/6] FROM docker.io/library/composer
=> CACHED [internal] helper image for file operations
=> CACHED [2/6] RUN set -eux; composer global requ
=> [3/6] COPY composer.* ./
=> [4/6] RUN set -eux; composer install --
=> [5/6] COPY app/ /app/app/
=> [6/6] RUN set -eux; composer dump-autoload ..
この動作は、次の変更で修正できます。
COPY composer.json ./
COPY composer.lock ./
それ以外の
COPY composer* ./
しかし、私を悩ませているのは、なぜこれが起こっているのですか? 私はこれで数時間を失いました:/
Docker のバージョン
➜ composer docker version
Client:
Version: 19.03.8-ce
API version: 1.40
Go version: go1.14
Git commit: afacb8b7f0
Built: Mon Mar 16 22:23:09 2020
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 19.03.8-ce
API version: 1.40 (minimum version 1.12)
Go version: go1.14
Git commit: afacb8b7f0
Built: Mon Mar 16 22:22:53 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.3.3.m
GitCommit: d76c121f76a5fc8a462dc64594aea72fe18e1178.m
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
ファイルは次のとおりです。
composer.json
{
"name": "test/docker_composer_cached",
"authors": [
{
"name": "Kitensei"
}
],
"require": {
"moc/math": "dev-master"
},
"minimum-stability": "dev"
}
Dockerfile
# syntax=docker/dockerfile:1.0-experimental
FROM composer
COPY composer.* ./
RUN set -eux; \
composer install \
--ignore-platform-reqs \
--no-autoloader \
--no-dev \
--no-interaction \
--no-scripts \
--no-suggest \
--no-plugins \
--no-progress \
--prefer-dist \
; \
find vendor -name ".git" -type d | xargs rm -rf
COPY app/ /app/app/
RUN set -eux; \
composer dump-autoload \
--classmap-authoritative \
--optimize \
--no-scripts \
--no-dev
App\Kernel.php
<?php
namespace App;
class Kernel {
}