我不确定这一点,但我注意到在复制带有通配符的文件时,docker层缓存会中断,请参见以下构建上下文:
问题在于,在修改 Kernel.php (添加空格,任何内容..)并再次运行docker build
时,“ 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 {
}