首页 > 解决方案 > 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_pathpytest 固定装置(或特定于库的临时路径),并且这些测试因一系列随机错误而失败 - 主要是找不到文件、找不到模块等。

在开发容器之外手动运行相同的程序。

为什么来?

标签: dockerdocker-in-docker

解决方案


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容器中就会有一个目录。

推荐阅读