【问题标题】:docker build uses wrong Dockerfile content (bug?)docker build 使用错误的 Dockerfile 内容(错误?)
【发布时间】:2021-11-09 09:41:40
【问题描述】:

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

查看下一个日志:

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> 

查看 Dockerfile 如何使用

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) 在之前构建的兄弟项目中的先前 Dockerfile 中使用(所有这些都是构建一些图像的伪 CI .cmd 进程的一部分)。

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

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

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

看起来 Dockerfile 内容本身正在被缓存或其他什么,它正在重用以前的 Dockerfile。

环境:使用 WSL2 后端的 Windows 10 上适用于 Windows 3.6.0 的 Docker 桌面。

Edit1:用 4.0.1 测试过,仍然失败。

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

【问题讨论】:

  • 你给这个项目和兄弟项目的标签是一样的吗?还是驻留在同一目录中?我认为您对缓存的看法是正确的,而不是因为...
  • 它们不是同一个标签(每个标签都被构建并推送到 docker hub)。它们都不驻留在同一目录中(.cmd 本质上是cd dir1; docker build -t dir1:latest; cd ..; cd dir2; docker build -t dir2:latest; cd ..;
  • 我明白了,感谢您的回复,您可以尝试重新启动 docker 服务吗?也许它陷入了某种模糊的状态
  • 没有帮助。实际上,我已经升级到最新版本 n(所以在此过程中重新启动)。

标签: docker docker-desktop


【解决方案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

编辑:

Dockerfile 内容未更新似乎是由于构建器未针对具有相同大小/时间戳的文件更新上下文: https://github.com/moby/buildkit/issues/1368

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

编辑 2,作者:Javier Sedano:

阅读github线程后,看起来问题如下:Docker缓存Dockerfile并使用时间戳和文件大小作为chache的键。就我而言,Dockerfiles 仅在采购/仓库方面有所不同......它们都是 9 个字符长......所以 Dockerfiles 具有相同的大小。时间戳是相同的,因为它们是从 GitLab 下载为 .zip 文件的。

解决方法(我已经对它们进行了测试,并且它们都对我有用,因此选择取决于其余的限制条件):

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

B.-将文件修改为不同的大小(我不喜欢这种解决方案,因为它将来可能会再次发生冲突)。

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

【讨论】:

  • 没有 .dockerignore 。另外,请注意根本问题不是找不到文件。根本问题是它使用的 Dockerfile 内容不是我在 cli 中声明的 Dockerfile ......所以这种错误的 Dockerfile 引用了另一个文件,然后找不到它。但根本问题是为什么它使用的不是我告诉它的 Dockerfile?
  • 试过--no-cache和--no-cache=true,都没有成功。
  • 感谢您的反馈,它似乎与调用docker build 时定义的build context 有关,并且可能是一个已知的错误。
  • 我不认为这是上下文,因为在正确的文件夹中搜索(但未找到)该文件。所以看起来它正在设置正确的上下文。只有 Dockerfile 内容有误。
  • 仍然没有测试线程中给出的解决方法,但我会,并在几个小时内报告。
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
相关资源
最近更新 更多