我的目录结构:
├── 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服务器版本{{1}一起运行},API版本18.09.3
。