对于嵌套的忽略文件,Docker 构建有时会因“文件未找到或被 .dockerignore 排除”而失败

Mug*_*gen 11 node-modules docker dockerfile docker-build

我的目录结构:

??? src/
?????? backend/
???????? Dockerfile
???????? ...
?????? frontend/
???????? Dockerfile
???????? node_modules/
???????? ...
?????? commons/
???????? ...
??? .dockerignore
Run Code Online (Sandbox Code Playgroud)

.dockerignore包括行**/node_modules和我的构建上下文的根目录是由于使用commons

我两个都跑

docker build ... -f src/backend/Dockerfile .

docker build ... -f src/frontend/Dockerfile .

并行,有时backend构建会因以下特定错误而失败:

错误检查上下文:“文件 ('/workspace/src/frontend/node_modules/.staging/wrap-ansi-2a6f888f') 未找到或被 .dockerignore 排除”。

根据我的理解(请参阅为什么 Node 模块会进入 .staging 文件夹?)该.staging文件夹是临时的,并且在运行它时可能存在竞争条件(请参阅 Docker cli源代码)。

但是,如果node_modules忽略这个文件,为什么首先会走呢?我是在滥用忽略上下文功能还是实际的竞争条件?

该问题在 Google Cloud Build 环境中重现,其中我通过图像使用 docker cli,该图像gcr.io/cloud-builders/docker使用 docker 客户端版本19.03.5并使用 docker server version 18.09.3, API version 运行1.39

Ral*_*ack 0

清理你的系统。

docker system prune -a
Run Code Online (Sandbox Code Playgroud)

请注意,这还将删除容器中未使用的所有图像。