代码之家  ›  专栏  ›  技术社区  ›  nikib3ro

如何在启动xunit测试之前调出docker compose中指定的容器?

  •  2
  • nikib3ro  · 技术社区  · 7 年前

    我需要运行一系列依赖于几个Docker容器的xUnit测试。我希望xunit负责整个流程启动容器(类似于 docker-compose env up ,运行测试,然后撕裂容器(即 docker-compose env down )

    visual studio或xunit是否支持此过程,或者此过程需要手动实现?

    1 回复  |  直到 7 年前
        1
  •  1
  •   nikib3ro    7 年前

    要在没有任何额外依赖项的情况下执行此操作,可以使用 Process.Start 通过命令行模拟启动。以下是包装并提供此功能的类:

    public class DockerStarter : IDisposable
    {
        private const string DOCKER_COMPOSE = @"c:\Program Files\Docker\Docker\resources\bin\docker-compose.exe";
        public string ComposeFile { get; set; }
        public string WorkingDir { get; set; }
    
        public DockerStarter(string composeFile, string workingDir)
        {
            ComposeFile = composeFile;
            WorkingDir = workingDir;
        }
    
        public void Start()
        {
            var startInfo = generateInfo("up");
            _dockerProcess = Process.Start(startInfo);
            // TODO: Find better way to wait for Docker containers to start
            Thread.Sleep(1000);
        }
    
        private Process _dockerProcess;
    
        public void Dispose()
        {
            _dockerProcess.Close();
    
            var stopInfo = generateInfo("down");
            var stop = Process.Start(stopInfo);
            stop.WaitForExit();
        }
    
        private ProcessStartInfo generateInfo(string argument)
        {
            var procInfo = new ProcessStartInfo
            {
                FileName = DOCKER_COMPOSE,
                Arguments = $"-f {ComposeFile} {argument}",
                WorkingDirectory = WorkingDir
            };
            return procInfo;
        }
    }
    

    显然,这种方法有缺点:

    • 固定路径到 docker-compose 可执行文件
    • 手动等待容器启动

    我会看看是否有更好的方式直接与Docker守护进程交互,并在可能的情况下更新答案。