提问者:小点点

Docker build有时在嵌套忽略文件的“文件未被.dockerignore找到或排除”时失败


我的目录结构:

├── src/
├───── backend/
├─────── Dockerfile
├─────── ...
├───── frontend/
├─────── Dockerfile
├─────── node_modules/
├─────── ...
├───── commons/
├─────── ...
├── .dockerignore

。dockerignore包括行**/node\u modules,由于使用了commons,因此我的构建上下文是根目录。

我两个都跑

docker构建-f src/backend/Dockerfile

docker构建...-f src/前端/Dockerfile.

同时,有时后端构建会因以下特定错误而失败:

错误检查上下文:'文件('/workspace/src/前端/node_modules/. staging-包装-ansi-2a6f888f')未找到或排除由. docker忽略。

据我所知(请参阅为什么节点模块进入.staging文件夹?)。暂存文件夹是临时的,在遍历它时可能存在争用条件(请参阅Docker cli源代码)。

但是,如果忽略node\u modules,为什么首先要遍历此文件?我是否误用了忽略上下文功能,或者这是一个实际的竞争条件?

这个问题在谷歌云构建环境中重现,我正在通过imagegcr使用docker cli。io/cloud builders/docker,它使用docker客户端版本19.03。5并与docker server版本18.09一起运行。3,API版本1.39


共1个答案

匿名用户

免责声明:我不是节点。js开发者

运行npm安装将需要的Node模块暂时下载到. stging文件夹中,以便可以安装它们。正如我从你的帖子中了解到的,node_modules被忽略,包括它的子文件夹。这意味着不能再访问. stging文件夹。

您可能需要注意的另一个问题(来自Docker官方文档):

不要使用根目录作为构建上下文的路径,因为它会导致构建将硬盘驱动器的全部内容传输到Docker守护进程。

这可能会在生成过程中导致冲突