【问题标题】:Docker-in-Docker Pytest Failing with temp pathsDocker-in-Docker Pytest 使用临时路径失败
【发布时间】:2021-01-25 07:43:30
【问题描述】:

我们在容器中进行所有开发,我们的一个应用程序在生产中通过docker-py 管理 docker。所以测试变成了docker-ception(docker in docker)。我们通过compose挂载主机docker.sock进行开发(即挂载docker-py直接使用的卷/var/run/docker.sock:/var/run/docker.sock

许多测试使用tmp_path pytest 固定装置(或特定于库的临时路径),并且这些测试因一系列随机错误而失败 - 主要是找不到文件、找不到模块等。

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

为什么来?

【问题讨论】:

  • (这听起来像是您使用的是主机 Docker 守护进程,而不是 DinD:您没有在容器中运行第二个 Docker 守护进程。)
  • 是的,主机守护进程,从技术上讲是 docker-next-to-docker,但是它非常像 DinD,因为 docker 编排都是在第一个容器中完成的(包括第二个容器的构建和运行)容器)

标签: docker docker-in-docker


【解决方案1】:

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 

调试时

  • 记得检查子容器内文件的文件类型,看它们是否 实际安装。 Docker 将为它在主机上找不到的每个文件创建空目录。所以如果main.py实际上没有挂载,那么容器中就会有一个main.py目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多