Кеширование Docker с подстановочным знаком ADD
Я не уверен в этом, но я заметил, что кеш уровня докеров ломается при копировании файлов с подстановочными знаками, см. Следующий контекст сборки:
Проблема в том, что при изменении Kernel.php (добавьте пробел, что угодно..) и запуститеdocker build
опять же, слои после "copy composer. *" запускаются снова, каждый раз, даже если никакие данные 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* ./
Но что меня беспокоит, так это почему это происходит? Я потерял несколько часов с этим: /
Версия докера
➜ 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
Приложение \Kernel.php
<?php
namespace App;
class Kernel {
}