MyGit

isen-ng/testcontainers-dotnet

Fork: 6 Star: 35 (更新于 2024-12-17 07:49:09)

license: MIT

Language: C# .

dotnet port of testcontainers-java

最后发布版本: v1.5.4 ( 2022-07-01 18:03:25)

GitHub网址

This repo is no longer supported or updated!

Please use the official repo: https://github.com/testcontainers/testcontainers-dotnet

TestContainers dotnet

codecov Sonarcloud Status Donation

Testcontainers is a dotnet standard 2.0 library that supports NUnit and XUnit tests, providing lightweight, throwaway instances of common databases or anything else that can run in a Docker container.

Uses common Microsoft dependency injection patterns, app and host settings, and Microsoft Extensions Logging (MEL).

This is a port of testcontainers-java for dotnet.

Build statuses

Linux build status


Feature parity

Linux environment

  • Container management
  • Docker providers
    • Unix socket
    • Environment
  • Image management
    • Pulling from public repo
    • Building from docker file
  • Network management
    • User defined networks
    • Network aliases
  • Ryuk resource reaper

Linux containers on Windows (LCOW) environment

  • Container management
  • Docker providers
    • Npipe
    • Environment
  • Image management
    • Pulling from public repo
    • Building from docker file
  • Network management
    • User defined networks
    • Network aliases
  • Ryuk resource reaper
  • [Need help] Classic LCOW CI on Win10 (GUI) environment
    • Requires the GUI version of Docker Desktop for Windows

Experimental LCOW on Windows environment

  • Not supported
    • Primarily because this experimental feature does not allow mounting of the docker socket/npipe into a container
    • More info

Built-in containers

Container Readme Version
Generic Container -- Generic
MsSql Container README MySql
PostgreSql Container README PostgreSql
ArangoDb Container README ArangoDb
Mysql Container README MySql

Example code

For more examples, see integration tests

Start a container by pulling the image from a remote repository

var container = new ContainerBuilder<GenericContainer>()
    .ConfigureHostConfiguration(builder => builder.AddInMemoryCollection()) // host settings
    .ConfigureAppConfiguration((context, builder) => builder.AddInMemoryCollection()) // app settings
    .ConfigureDockerImageName(PlatformSpecific.TinyDockerImage)
    .ConfigureLogging(builder => builder.AddConsole()) // Microsoft extensions logging
    .ConfigureContainer((context, container) =>
    {
        // add labels
        container.Labels.Add(CustomLabel.Key, CustomLabel.Value);

        // add environment labels
        container.Env[InjectedEnvVar.Key] = InjectedEnvVar.Value;

        // add exposed ports (automatically mapped to higher port
        container.ExposedPorts.Add(ExposedPort);

        /*
         to do something like `docker run -p 2345:34567 alpine:latest`,
         both expose port and port binding must be set
         */
        container.ExposedPorts.Add(PortBinding.Key);
        container.PortBindings.Add(PortBinding.Key, PortBinding.Value);

        // add bind mounts
        container.BindMounts.Add(new Bind
        {
            HostPath = HostPathBinding.Key,
            ContainerPath = HostPathBinding.Value,
            AccessMode = AccessMode.ReadOnly
        });

        // set working directory
        container.WorkingDirectory = WorkingDirectory;

        // set command to run
        container.Command = PlatformSpecific.ShellCommand(
                $"{PlatformSpecific.Touch} {FileTouchedByCommand}; {PlatformSpecific.Shell}")
            .ToList();
    })
    .Build();

Start a container by building the image from a Dockerfile

var image = new ImageBuilder<DockerfileImage>()
    .ConfigureHostConfiguration(builder => builder.AddInMemoryCollection()) // host settings
    .ConfigureAppConfiguration((context, builder) => builder.AddInMemoryCollection()) // app settings
    .ConfigureLogging(builder => builder.AddConsole()) // Microsoft extensions logging
    .ConfigureImage((context, image) =>
    {
        image.DockerfilePath = "Dockerfile";
        image.DeleteOnExit = false;

        // add the Dockerfile into the build context
        image.Transferables.Add("Dockerfile", new MountableFile(PlatformSpecific.DockerfileImagePath));
        // add other files required by the Dockerfile into the build context
        image.Transferables.Add(".", new MountableFile(PlatformSpecific.DockerfileImageContext));
    })
    .Build();

var container = new ContainerBuilder<GenericContainer>()
    .ConfigureDockerImage(image)
    .ConfigureHostConfiguration(builder => builder.AddInMemoryCollection()) // host settings
    .ConfigureAppConfiguration((context, builder) => builder.AddInMemoryCollection()) // app settings
    .ConfigureLogging(builder => builder.AddConsole()) // Microsoft extensions logging
    .ConfigureContainer((h, c) =>
    {
        c.ExposedPorts.Add(80);
    })
    .Build();

or

var container = new ContainerBuilder<GenericContainer>()
    .ConfigureDockerImage((hostContext, builderContext) =>
    {
        return new ImageBuilder<DockerfileImage>()
            // share the app/host config and service collection from the parent builder context
            .WithContextFrom(builderContext)
            .ConfigureImage((context, image) =>
            {
                image.DeleteOnExit = false;
                image.BasePath = PlatformSpecific.DockerfileImageContext;

                // add the Dockerfile as like the command line `-f <path to dockerfile`
                image.DockerfilePath = "Dockerfile";
                image.Transferables.Add("Dockerfile", new MountableFile(PlatformSpecific.DockerfileImagePath));

                // add other files required by the Dockerfile into the build context
                image.Transferables.Add("folder1", new MountableFile(DockerfileImageTransferableFolder));
            })
            .Build();
    })
    .ConfigureHostConfiguration(builder => builder.AddInMemoryCollection()) // host settings
    .ConfigureAppConfiguration((context, builder) => builder.AddInMemoryCollection()) // app settings
    .ConfigureLogging(builder => builder.AddConsole()) // Microsoft extensions logging
    .ConfigureContainer((h, c) =>
    {
        c.ExposedPorts.Add(80);
    })
    .Build();

Start a container with a new network

var container = new ContainerBuilder<GenericContainer>()
    .ConfigureNetwork((hostContext, builderContext) =>
    {
        return new NetworkBuilder<UserDefinedNetwork>()
            // share the app/host config and service collection from the parent builder context
            .WithContextFrom(builderContext)
            .ConfigureNetwork((context, network) =>
            {
                // be careful when setting static network names
                // if they already exists, the existing network will be used
                // otherwise, the default NetworkName is a random string
                network.NetworkName = "my_network"
            })
            .Build();
    })
    .ConfigureHostConfiguration(builder => builder.AddInMemoryCollection()) // host settings
    .ConfigureAppConfiguration((context, builder) => builder.AddInMemoryCollection()) // app settings
    .ConfigureLogging(builder => builder.AddConsole()) // Microsoft extensions logging
    .ConfigureContainer((h, c) =>
    {
        c.ExposedPorts.Add(80);
    })
    .Build();

Configuring TestContainers-dotnet

There are some configurations to testcontainers-dotnet that cannot be performed in code or injected. These configuration can be set in environment variables before the first instance of your container is built.

Variable Default Description
REAPER_DISABLED (not-set) When set to 1 or true, disables starting of the reaper container
REAPER_IMAGE quay.io/testcontainers/ryuk:0.2.3 Change which container image to use for reaper
REAPER_PORT (not-set) Use the given port for reaper instead of a dynamic port

最近版本更新:(数据更新于 2024-09-03 04:41:51)

2022-07-01 18:03:25 v1.5.4

2022-03-09 15:57:10 v1.5.3

2022-02-03 11:32:54 v1.5.2

2022-01-03 11:25:04 v1.5.1

2022-01-03 11:18:19 v1.5.1-RC

2020-04-04 01:04:26 v1.5.0

2020-03-06 10:16:06 v1.4.9

2020-03-03 14:58:10 v1.4.8

2020-02-03 09:43:08 v1.4.7

2019-11-13 11:28:33 v1.4.6

主题(topics):

csharp, dotnet, dotnet-core, nunit, test-containers, xunit

isen-ng/testcontainers-dotnet同语言 C#最近更新仓库

2024-12-20 06:41:40 microsoft/PowerToys

2024-12-07 22:15:43 Pik-4/HsMod

2024-12-01 20:18:03 BililiveRecorder/BililiveRecorder

2024-11-26 14:48:43 Azure/azure-sdk-for-net

2024-11-19 11:38:46 jellyfin/jellyfin

2024-11-15 10:33:01 DigitalRuby/IPBan