我的目录结构:
├── 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
。
免责声明:我不是节点。js开发者
运行npm安装
将需要的Node模块暂时下载到. stging
文件夹中,以便可以安装它们。正如我从你的帖子中了解到的,node_modules
被忽略,包括它的子文件夹。这意味着不能再访问. stging
文件夹。
您可能需要注意的另一个问题(来自Docker官方文档):
不要使用根目录作为构建上下文的路径,因为它会导致构建将硬盘驱动器的全部内容传输到Docker守护进程。
这可能会在生成过程中导致冲突