mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-15 14:26:33 +01:00
0b6fa5ee40
This adds a new `imageStream` option that can be used in conjunction with `pkgs.dockerTools.streamLayeredImage` so that the image archive never needs to be materialized in the `/nix/store`. This greatly improves the disk utilization for systems that use container images built using Nix because they only need to store image layers instead of the full image. Additionally, when deploying the new system and only new layers need to be built/copied.
98 lines
2.8 KiB
Nix
98 lines
2.8 KiB
Nix
# Test Traefik as a reverse proxy of a local web service
|
|
# and a Docker container.
|
|
import ./make-test-python.nix ({ pkgs, ... }: {
|
|
name = "traefik";
|
|
meta = with pkgs.lib.maintainers; {
|
|
maintainers = [ joko ];
|
|
};
|
|
|
|
nodes = {
|
|
client = { config, pkgs, ... }: {
|
|
environment.systemPackages = [ pkgs.curl ];
|
|
};
|
|
traefik = { config, pkgs, ... }: {
|
|
virtualisation.oci-containers = {
|
|
backend = "docker";
|
|
containers.nginx = {
|
|
extraOptions = [
|
|
"-l"
|
|
"traefik.enable=true"
|
|
"-l"
|
|
"traefik.http.routers.nginx.entrypoints=web"
|
|
"-l"
|
|
"traefik.http.routers.nginx.rule=Host(`nginx.traefik.test`)"
|
|
];
|
|
image = "nginx-container";
|
|
imageStream = pkgs.dockerTools.examples.nginxStream;
|
|
};
|
|
};
|
|
|
|
networking.firewall.allowedTCPPorts = [ 80 ];
|
|
|
|
services.traefik = {
|
|
enable = true;
|
|
|
|
dynamicConfigOptions = {
|
|
http.routers.simplehttp = {
|
|
rule = "Host(`simplehttp.traefik.test`)";
|
|
entryPoints = [ "web" ];
|
|
service = "simplehttp";
|
|
};
|
|
|
|
http.services.simplehttp = {
|
|
loadBalancer.servers = [{
|
|
url = "http://127.0.0.1:8000";
|
|
}];
|
|
};
|
|
};
|
|
|
|
staticConfigOptions = {
|
|
global = {
|
|
checkNewVersion = false;
|
|
sendAnonymousUsage = false;
|
|
};
|
|
|
|
entryPoints.web.address = ":\${HTTP_PORT}";
|
|
|
|
providers.docker.exposedByDefault = false;
|
|
};
|
|
environmentFiles = [(pkgs.writeText "traefik.env" ''
|
|
HTTP_PORT=80
|
|
'')];
|
|
};
|
|
|
|
systemd.services.simplehttp = {
|
|
script = "${pkgs.python3}/bin/python -m http.server 8000";
|
|
serviceConfig.Type = "simple";
|
|
wantedBy = [ "multi-user.target" ];
|
|
};
|
|
|
|
users.users.traefik.extraGroups = [ "docker" ];
|
|
};
|
|
};
|
|
|
|
testScript = ''
|
|
start_all()
|
|
|
|
traefik.wait_for_unit("docker-nginx.service")
|
|
traefik.wait_until_succeeds("docker ps | grep nginx-container")
|
|
traefik.wait_for_unit("simplehttp.service")
|
|
traefik.wait_for_unit("traefik.service")
|
|
traefik.wait_for_open_port(80)
|
|
traefik.wait_for_unit("multi-user.target")
|
|
|
|
client.wait_for_unit("multi-user.target")
|
|
|
|
client.wait_until_succeeds("curl -sSf -H Host:nginx.traefik.test http://traefik/")
|
|
|
|
with subtest("Check that a container can be reached via Traefik"):
|
|
assert "Hello from NGINX" in client.succeed(
|
|
"curl -sSf -H Host:nginx.traefik.test http://traefik/"
|
|
)
|
|
|
|
with subtest("Check that dynamic configuration works"):
|
|
assert "Directory listing for " in client.succeed(
|
|
"curl -sSf -H Host:simplehttp.traefik.test http://traefik/"
|
|
)
|
|
'';
|
|
})
|