我们在容器中进行所有的开发,我们的一个应用程序在生产中通过docker-py管理docker。所以测试变成了docker-ception (docker in docker)。我们通过compose for development挂载主机docker.sock (即挂载docker-py直接使用的卷/var/run/docker.sock:/var/run/docker.sock
)。
许多测试使用tmp_path
pytest fixture (或库特定的临时路径),这些测试失败并出现一系列随机错误--主要是找不到文件、找不到模块等。
手动和在dev容器外运行相同的过程。
为什么要来?
发布于 2020-10-10 20:24:35
TLDR
在开发环境中,需要将/tmp
文件夹挂载为卷。添加
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /tmp:/tmp
使来自测试的临时资产可用于子容器。
长篇大论的回答
Docker-in-docker使用主机docker.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
调试时
main.py
没有实际挂载,容器中将会有一个main.py
目录。https://stackoverflow.com/questions/64293373
复制相似问题