docker 构建使用了错误的 Dockerfile 内容(错误?)

docker build uses wrong Dockerfile content (bug?)

多年来我一直在使用 docker,现在我发现了一个非常奇怪的行为:docker build 命令使用了一个 Docker 文件,这不是我拥有的文件。

查看下一篇日志:

PS D:\reposNovabase\charmander\charmanderWarehouse> type Dockerfile  
FROM adoptopenjdk/openjdk11-openj9:jdk-11.0.11_9_openj9-0.26.0-alpine
WORKDIR /app
COPY build/libs/charmanderWarehouse-1.0.0-SNAPSHOT.jar /app
EXPOSE 8083
CMD ["java", "-Xmx70m", "-jar", "charmanderWarehouse-1.0.0-SNAPSHOT.jar"]
PS D:\reposNovabase\charmander\charmanderWarehouse> docker build -f Dockerfile -t javiersedano/charmander-warehouse:test1 .
[+] Building 0.2s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                  0.0s 
 => => transferring dockerfile: 32B                                                                                                                                   0.0s 
 => [internal] load .dockerignore                                                                                                                                     0.0s 
 => => transferring context: 2B                                                                                                                                       0.0s 
 => [internal] load metadata for docker.io/adoptopenjdk/openjdk11-openj9:jdk-11.0.11_9_openj9-0.26.0-alpine                                                           0.0s 
 => [1/3] FROM docker.io/adoptopenjdk/openjdk11-openj9:jdk-11.0.11_9_openj9-0.26.0-alpine                                                                             0.0s 
 => [internal] load build context                                                                                                                                     0.0s 
 => => transferring context: 57B                                                                                                                                      0.0s 
 => CACHED [2/3] WORKDIR /app                                                                                                                                         0.0s 
 => ERROR [3/3] COPY build/libs/charmanderPurchases-1.0.0-SNAPSHOT.jar /app                                                                                           0.0s 
------
 > [3/3] COPY build/libs/charmanderPurchases-1.0.0-SNAPSHOT.jar /app:
------
failed to compute cache key: "/build/libs/charmanderPurchases-1.0.0-SNAPSHOT.jar" not found: not found
PS D:\reposNovabase\charmander\charmanderWarehouse> 

查看Docker文件如何使用

COPY build/libs/charmanderWarehouse-1.0.0-SNAPSHOT.jar /app

但是 docker build 失败

ERROR [3/3] COPY build/libs/charmanderPurchases-1.0.0-SNAPSHOT.jar /app

为什么要复制 charmanderPurchases?!!

更多提示:该文件失败(charmanderPurchases)用于前一个Docker兄弟项目中的文件,该文件是在一秒钟之前构建的(所有这些都是伪[=43=的一部分) ] .cmd 过程构建了一些图像)。

更多提示:我有一个解决方法。如果我使用

type Dockerfile | build -f - -t javiersedano/charmander-warehouse:test1 .

然后它按预期工作;此外,在这个解决方法之后,第一个命令也按预期工作......但是,失败的构建是兄弟项目的构建,因为 charmanderPurchases 试图 COPY charmanderWarehouse......WTF?!

看起来 Docker 文件内容本身正在被缓存或什么的,它正在重复使用以前的 Docker 文件。

环境:Docker Windows 3.6.0 桌面 Windows 10 使用 WSL2 后端。

Edit1:使用 4.0.1 进行测试但仍然失败。

有什么提示吗?有什么想法吗?

(最终解决方案见下面的edit2)

关于您的错误,它可能来自 .dockerignore 文件 排除 charmanderWarehouse-1.0.0-SNAPSHOT.jar 或其父项之一(可能 build

如果它不是来自 .dockerignore,您可以尝试选项 --no-cache=true 来构建您的图像而不重用缓存。

docker build --no-cache=true -f Dockerfile -t javiersedano/charmander-warehouse:test1 .

更多信息在这里: https://docs.docker.com/engine/reference/commandline/build/#options

编辑:

Docker文件内容未更新似乎是由于构建器未针对具有相同 size/timestamp 的文件更新上下文: https://github.com/moby/buildkit/issues/1368

这是一个可能的解决方法: docker builder prune 每次构建之间。

编辑 2,作者:Javier Sedano:

读取 github 线程后,问题如下:Docker 缓存 Docker 文件并使用时间戳和文件大小作为缓存的键。在我的例子中,Docker 文件仅在 purchases/warehouse... 上不同,它们都是 9 个字符长...所以 Docker 文件具有相同的大小。时间戳相同,因为它们是从 GitLab 下载的 .zip 文件。

解决方法(我已经测试了它们并且它们都对我有用,所以选择取决于其余的限制):

A.-使用cat Dockerfile | docker build -f - -t xxxx:tttt

B.-修改文件大小不一样(我不喜欢这个方案因为以后可能会再次冲突)

C.-在构建之前使用docker builder prune -f