public void BuildImageFromFileWithCopyAndRunInstructionShallWork() { using ( var image = Fd.DefineImage("mariotoffia/unittest:latest") .From("ubuntu:14.04") .Maintainer("Mario Toffia <*****@*****.**>") .Run("apt-get update") .Run("apt-get install -y software-properties-common python") .Run("add-apt-repository ppa:chris-lea/node.js") .Run("echo \"deb http://us.archive.ubuntu.com/ubuntu/ precise universe\" >> /etc/apt/sources.list") .Run("apt-get update") .Run("apt-get install -y nodejs") .Run("mkdir /var/www") .Add("emb:Ductus.FluentDocker.Tests/Ductus.FluentDocker.Tests.MultiContainerTestFiles/app.js", "/var/www/app.js") .Command("/usr/bin/node", "/var/www/app.js") .Build()) { var config = image.GetConfiguration(true); Assert.IsNotNull(config); Assert.AreEqual(2, config.Config.Cmd.Length); Assert.AreEqual("/usr/bin/node", config.Config.Cmd[0]); Assert.AreEqual("/var/www/app.js", config.Config.Cmd[1]); } }
public void Issue111_WaitForProcess() { using (var scope = Fd.EngineScope(EngineScopeType.Windows)) { using ( var container = Fd.DefineImage("mariotoffia/issue111").ReuseIfAlreadyExists() .From("mcr.microsoft.com/windows/servercore:ltsc2019") .Shell("powershell", "-Command", "$ErrorActionPreference = 'Stop';") .Run("Set-ExecutionPolicy Bypass -Scope Process -Force; " + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12") .Run("Invoke-WebRequest -OutFile install.ps1 https://www.chocolatey.org/install.ps1; " + "./install.ps1") .Run("choco feature enable --name=allowGlobalConfirmation") .Run("choco install python3") .Copy("Resources/Issue/111/server.py", "C:/") .ExposePorts(8000) .Command("python", "server.py") .Builder().UseContainer().UseImage("mariotoffia/issue111") .WaitForProcess("python.exe", (long)TimeSpan.FromSeconds(30).TotalMilliseconds) .Builder() .Build() .Start()) { var c = container.Containers.First(); var config = c.GetConfiguration(true); AreEqual(ServiceRunningState.Running, config.State.ToServiceState()); } } }
public void BuildImageShouldPropagateBuildArguments() { using ( var image = Fd.DefineImage("mariotoffia/fd-args-test:latest") .BuildArguments("configuration=Debug") .FromString(@" FROM alpine ARG configuration=Release ENV CONFIGURATION $configuration ") .Build()) { var config = image.GetConfiguration(true); Assert.IsTrue(config.Config.Env.Any(env => env == "CONFIGURATION=Debug")); } }
public async Task DefineAndBuildImageAddNgixAsLoadBalancerTwoNodesAsHtmlServeAndRedisAsDbBackendShouldWorkAsCluster() { var fullPath = (TemplateString)@"${TEMP}\fluentdockertest\${RND}"; var nginx = Path.Combine(fullPath, "nginx.conf"); Directory.CreateDirectory(fullPath); typeof(NsResolver).ResourceExtract(fullPath, "index.js"); try { using (var services = // Define custom node image to be used Fd.DefineImage("mariotoffia/nodetest").ReuseIfAlreadyExists() .From("ubuntu:14.04") .Maintainer("Mario Toffia <*****@*****.**>") .WorkingFolder(fullPath) .Run("apt-get update &&", "apt-get -y install curl &&", "curl -sL https://deb.nodesource.com/setup | sudo bash - &&", "apt-get -y install python build-essential nodejs") .Run("npm install -g nodemon") .Add("emb:Ductus.FluentDocker.Tests/Ductus.FluentDocker.Tests.MultiContainerTestFiles/package.txt", "/tmp/package.json") .Run("cd /tmp && npm install") .Run("mkdir -p /src && cp -a /tmp/node_modules /src/") .UseWorkDir("/src") .Add("index.js", "/src") .ExposePorts(8080) .Command("nodemon", "/src/index.js").Builder() // Redis Db Backend .UseContainer().WithName("redis").UseImage("redis").Builder() // Node server 1 & 2 .UseContainer().WithName("node1").UseImage("mariotoffia/nodetest").Link("redis").Builder() .UseContainer().WithName("node2").UseImage("mariotoffia/nodetest").Link("redis").Builder() // Nginx as load balancer .UseContainer().WithName("nginx").UseImage("nginx").Link("node1", "node2") .CopyOnStart(nginx, "/etc/nginx/nginx.conf") .ExposePort(80).Builder() .Build().Start()) { Assert.AreEqual(4, services.Containers.Count); var ep = services.Containers.First(x => x.Name == "nginx").ToHostExposedEndpoint("80/tcp"); Assert.IsNotNull(ep); var round1 = await $"http://{ep.Address}:{ep.Port}".Wget(); Assert.AreEqual("This page has been viewed 1 times!", round1); var round2 = await $"http://{ep.Address}:{ep.Port}".Wget(); Assert.AreEqual("This page has been viewed 2 times!", round2); } } finally { if (Directory.Exists(fullPath)) { Directory.Delete(fullPath, true); } } }