示例#1
0
 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());
         }
     }
 }
示例#3
0
        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"));
            }
        }
示例#4
0
        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);
                }
            }
        }