对于嵌套的忽略文件,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 找不到或排除的文件”而失败的主要内容,如果未能解决你的问题,请参考以下文章
AssignProcessToJobObject 有时会因 ERROR_ACCESS_DENIED 而失败
将作为varchar存储的数字10与浮点数1.1进行比较,会因算术溢出错误而失败