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

Posted

技术标签:

【中文标题】对于嵌套的忽略文件,Docker 构建有时会因“.dockerignore 找不到或排除的文件”而失败【英文标题】:Docker build sometimes fail on "file not found or excluded by .dockerignore" for a nested ignored file 【发布时间】:2020-05-15 18:40:18 【问题描述】:

我的目录结构:

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

.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' 未找到或排除。

据我了解(请参阅 Why do Node modules go into .staging folder?).staging 文件夹是临时的,在运行时可能会出现竞争情况(请参阅 Docker cli source)。

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

该问题在 Google Cloud Build 环境中重现,我通过映像 gcr.io/cloud-builders/docker 使用 docker cli,它使用 docker 客户端版本 19.03.5 并使用 docker 服务器版本 18.09.3 运行,API 版本 @987654335 @。

【问题讨论】:

首先,后端和前端服务都使用JS吗?其次,请添加您的 Dockerfile,以便我们可以获取更多关于 Dockerfile 运行过程的上下文 【参考方案1】:

免责声明:我不是 Node.js 开发人员

运行npm install 将所需的节点模块临时下载到.staging 文件夹中,以便可以安装它们。正如我从您的帖子中了解到的那样,node_modules 被忽略,包括其子文件夹。这意味着无法再访问.staging 文件夹。

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

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

这可能会导致构建期间发生冲突

【讨论】:

以上是关于对于嵌套的忽略文件,Docker 构建有时会因“.dockerignore 找不到或排除的文件”而失败的主要内容,如果未能解决你的问题,请参考以下文章

创建docker构建步骤

构建属于自己的 jre Docker 镜像

AssignProcessToJobObject 有时会因 ERROR_ACCESS_DENIED 而失败

将作为varchar存储的数字10与浮点数1.1进行比较,会因算术溢出错误而失败

Gitlab CI runner 无法暴露嵌套 Docker 容器的端口

Docker phpmyadmin 忽略了我的 php.ini 配置