我已经使用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.见鬼?!
看起来Dockerfile内容本身正在被缓存,并且它正在重用以前的Dockerfile。
环境:在Windows 10上使用WSL2后端的DockerDesktopforWindows3.6.0。
Edit1:用4.0.1进行测试,但仍然失败。
有什么暗示吗?有什么想法吗?
发布于 2021-09-14 09:57:46
(最终解决方案见下面的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:
读取github线程后,问题如下: Docker缓存Dockerfile并使用时间戳和文件大小作为chache的键。在我的例子中,Dockerfiles只在采购/仓库上有不同的地方.都是9个字符-长.所以Dockerfile的大小是一样的。时间戳是相同的,因为它们是作为.zip文件从GitLab下载的。
解决办法(我已经测试过它们,它们都为我工作,所以选择取决于其余的约束):
A.-使用cat Dockerfile | docker build -f - -t xxxx:tttt
修改文件不具有相同的大小(我不喜欢这个解决方案,因为它可能在未来再次冲突)。
建设前使用docker builder prune -f。
https://stackoverflow.com/questions/69173822
复制相似问题