我要在构建Docker映像时运行集成测试。这些测试需要实例化Docker容器。
是否可以在这样的多阶段docker构建中访问docker?
答案 0 :(得分:1)
不,你不能这样做。
您需要以某种方式访问主机的Docker套接字。在独立的docker run
命令中,您将执行类似docker run -v /var/run/docker.sock:/var/run/docker.sock
的操作,但是无法将该选项(或任何其他卷装入)传递到docker build
中。
对于运行单元类型的测试(不具有外部依赖项),我只需在Docker外部的开发环境或核心CI构建环境中运行它们,然后运行运行docker build
,直到它们通过为止。对于集成类型的测试(需要这样做),您需要设置那些依赖关系,也许使用Docker Compose文件,这又将在Docker之外更容易进行。这样还可以避免将测试代码及其附加依赖项构建到映像中。
(从技术上讲,有两种方法可以解决这两种问题。这两种方法中比较容易的是,大规模的安全灾难正在打开基于TCP的Docker套接字;然后Dockerfile可以连接到该[“ remote”] Docker守护程序并启动容器,阻止它们,杀死自己,模拟主机以进行入站SSH连接,启动无法在容器内部构建的比特币挖矿器,等等……实际上,它允许主机上的任何进程执行这些操作。正如@RaynalGobel在评论中建议的那样,是尝试在容器内启动一个单独的Docker守护程序; DinD映像链接指出它需要一个--privileged
容器,而在构建时您再也不能使用该容器。 )