docker - Docker-in-Docker Pytest 使用临时路径失败
问题描述
我们在容器中进行所有开发,我们的一个应用程序在生产中通过docker-py管理 docker 。所以测试变成了docker-ception(docker in docker)。我们通过compose挂载主机docker.sock进行开发(即挂载docker /var/run/docker.sock:/var/run/docker.sock
-py直接使用的volume。
许多测试使用tmp_path
pytest 固定装置(或特定于库的临时路径),并且这些测试因一系列随机错误而失败 - 主要是找不到文件、找不到模块等。
在开发容器之外手动运行相同的程序。
为什么来?
解决方案
TLDR
该/tmp
文件夹需要作为卷安装在开发环境中。添加
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /tmp:/tmp
使来自测试的临时资产可用于子容器。
长篇大论的回答
使用主机的 Docker-in-dockerdocker.sock
将容器创建为同级容器,而不是嵌套的子级容器。这意味着来自 parent->child 的 docker 文件系统引用将不起作用,因为它们正在访问与主机相同的文件系统。
#### /tmp files in parent not accessible to child ####
# on host machine # dev-container
/ /
|__/home/sven/Repos/dev |_/app # mounted to /home/sven/Repos/dev in host
|__/tmp # sub-container looks here! |_/tmp # pytest creates tmp files here
|__/lib |... etc
|... etc
调试时
- 记得检查子容器内文件的文件类型,看看它们是否实际挂载。Docker 将为它在主机上找不到的每个文件创建空目录。所以如果
main.py
没有实际挂载,main.py
容器中就会有一个目录。
推荐阅读
- notepad++ - Notepad++ 语法高亮:如何将“数字”和“布尔”声明为 JavaScript 的非关键字?
- react-router-dom - 使用 Tailwind css 设计 Navlink
- node.js - 尝试失败次数过多后如何在登录时实现 google recaptcha?
- autodesk-forge - Autodesk Forge 使用参考模型浏览器查看 ZIP 文件未显示加载的模型名称
- objective-c - 验证是否调用了特定方法时,单元测试失败。目标 C
- yeoman - yeoman 生成器可以在不同的生成器之间共享全局设置吗?
- python - 如何用python创建一个语音助手
- tensorflow - tensorflow 数据集“预取”方法是否为我的数据添加维度?为什么?
- java - 如何在android应用程序中使用spring boot websocket Stomp Api
- node.js - loopback4 dataSource 配置动态头,将数据传递给数据源