Чтобы сделать это без каких-либо дополнительных зависимостей, вы можете использовать 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 и по возможности обновить ответ.