Merge pull request #108 from hercules-ci/labels

Add service.labels
This commit is contained in:
Robert Hensing 2021-01-22 10:50:09 +01:00 committed by GitHub
commit c605eac50f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 120 additions and 42 deletions

View file

@ -1,5 +1,13 @@
# Revision history for Arion # Revision history for Arion
## Next
* Support `service.labels`, which is useful for autodiscovery among other things.
* Add a tested example for Traefik with label-based routing.
* Drop obsolete NixOS 19.09 and 20.03 support. It may still be usable there.
## 0.1.2.0 -- 2020-03-05 ## 0.1.2.0 -- 2020-03-05
* Support use of prebuilt `docker-compose.yaml`. * Support use of prebuilt `docker-compose.yaml`.

View file

@ -676,6 +676,28 @@ No Default:: {blank}
No Example:: {blank} No Example:: {blank}
== services.<name>.service.labels
See link:https://docs.docker.com/compose/compose-file/#labels[Docker Compose#labels]
[discrete]
=== details
Type:: attribute set of strings
Default::
+
----
{}
----
Example::
+
----
{"com.example.foo":"bar","traefik.enable":"true","traefik.http.routers.my-service.entrypoints":"web","traefik.http.routers.my-service.rule":"Host(`my-service.localhost`)"}
----
== services.<name>.service.links == services.<name>.service.links
See link:https://docs.docker.com/compose/compose-file/#links[Docker Compose#links] See link:https://docs.docker.com/compose/compose-file/#links[Docker Compose#links]

View file

@ -0,0 +1,49 @@
/*
An example of
- traefik HTTP reverse proxy
- minimal images
- routing via docker labels
Run `arion up -d` and open http://nix-docs.localhost/
*/
{ lib, pkgs, ... }: {
config.services = {
traefik = {
image.command = [
"${pkgs.traefik}/bin/traefik"
"--api.insecure=true"
"--providers.docker=true"
"--providers.docker.exposedbydefault=false"
"--entrypoints.web.address=:80"
];
service = {
container_name = "traefik";
stop_signal = "SIGINT";
ports = [ "80:80" "8080:8080" ];
volumes = [ "/var/run/docker.sock:/var/run/docker.sock:ro" ];
};
};
nix-docs = {
image.command = ["${pkgs.writeScript "entrypoint" ''
#!${pkgs.bash}/bin/bash
cd ${pkgs.nix.doc}/share/doc/nix/manual
${pkgs.python3}/bin/python -m http.server
''}"];
service.container_name = "simple-service";
service.ports = [
"8000:8000" # host:container
];
service.stop_signal = "SIGINT";
service.labels = {
"traefik.enable" = "true";
"traefik.http.routers.nix-docs.rule" = "Host(`nix-docs.localhost`)";
"traefik.http.routers.nix-docs.entrypoints" = "web";
};
};
};
}

View file

@ -0,0 +1,6 @@
# Instead of pinning Nixpkgs, we can opt to use the one in NIX_PATH
import <nixpkgs> {
# We specify the architecture explicitly. Use a Linux remote builder when
# calling arion from other platforms.
system = "x86_64-linux";
}

View file

@ -1,6 +1,6 @@
let let
sources = import ./sources.nix; sources = import ./sources.nix;
lib = import (sources."nixos-20.03" + "/lib"); lib = import (sources."nixos-unstable" + "/lib");
inherit (import (sources."project.nix" + "/lib/dimension.nix") { inherit lib; }) dimension; inherit (import (sources."project.nix" + "/lib/dimension.nix") { inherit lib; }) dimension;
in in
@ -14,16 +14,6 @@ dimension "Nixpkgs version" {
enableDoc = false; enableDoc = false;
nixosTestIsPerl = true; nixosTestIsPerl = true;
}; };
"nixos-19_09" = {
nixpkgsSource = "nixos-19.09";
enableDoc = false;
nixosTestIsPerl = true;
};
"nixos-20_03" = {
nixpkgsSource = "nixos-20.03";
isReferenceNixpkgs = false;
enableDoc = true;
};
"nixos-20_09" = { "nixos-20_09" = {
nixpkgsSource = "nixos-20.09"; nixpkgsSource = "nixos-20.09";
isReferenceNixpkgs = true; isReferenceNixpkgs = true;

View file

@ -23,30 +23,6 @@
"url": "https://github.com/NixOS/nixpkgs-channels/archive/34c7eb7545d155cc5b6f499b23a7cb1c96ab4d59.tar.gz", "url": "https://github.com/NixOS/nixpkgs-channels/archive/34c7eb7545d155cc5b6f499b23a7cb1c96ab4d59.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz" "url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
}, },
"nixos-19.09": {
"branch": "nixos-19.09",
"description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
"homepage": "https://github.com/NixOS/nixpkgs",
"owner": "NixOS",
"repo": "nixpkgs-channels",
"rev": "289466dd6a11c65a7de4a954d6ebf66c1ad07652",
"sha256": "0r5ja052s86fr54fm1zlhld3fwawz2w1d1gd6vbvpjrpjfyajibn",
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs-channels/archive/289466dd6a11c65a7de4a954d6ebf66c1ad07652.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"nixos-20.03": {
"branch": "release-20.03",
"description": "A read-only mirror of NixOS/nixpkgs tracking the released channels. Send issues and PRs to",
"homepage": "https://github.com/NixOS/nixpkgs",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b4db68ff563895eea6aab4ff24fa04ef403dfe14",
"sha256": "1qbs7p0mmcmpg70ibd437hl57byqx5q0pc61p1dckrkazj7kq0pc",
"type": "tarball",
"url": "https://github.com/NixOS/nixpkgs/archive/b4db68ff563895eea6aab4ff24fa04ef403dfe14.tar.gz",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
},
"nixos-20.09": { "nixos-20.09": {
"branch": "nixos-20.09", "branch": "nixos-20.09",
"description": "Nix Packages collection", "description": "Nix Packages collection",

View file

@ -115,6 +115,17 @@ in
${dockerComposeRef "devices"} ${dockerComposeRef "devices"}
''; '';
}; };
service.labels = mkOption {
type = attrsOf str;
default = {};
example = {
"com.example.foo" = "bar";
"traefik.enable" = "true";
"traefik.http.routers.my-service.rule" = "Host(`my-service.localhost`)";
"traefik.http.routers.my-service.entrypoints" = "web";
};
description = dockerComposeRef "labels";
};
service.links = mkOption { service.links = mkOption {
type = listOf str; type = listOf str;
default = []; default = [];
@ -247,6 +258,8 @@ in
inherit (config.service) extra_hosts; inherit (config.service) extra_hosts;
} // lib.optionalAttrs (config.service.hostname != null) { } // lib.optionalAttrs (config.service.hostname != null) {
inherit (config.service) hostname; inherit (config.service) hostname;
} // lib.optionalAttrs (config.service.labels != {}) {
inherit (config.service) labels;
} // lib.optionalAttrs (config.service.links != []) { } // lib.optionalAttrs (config.service.links != []) {
inherit (config.service) links; inherit (config.service) links;
} // lib.optionalAttrs (config.service.ports != []) { } // lib.optionalAttrs (config.service.ports != []) {

View file

@ -33,13 +33,14 @@ in
(preEval [ ../../examples/minimal/arion-compose.nix ]).config.out.dockerComposeYaml (preEval [ ../../examples/minimal/arion-compose.nix ]).config.out.dockerComposeYaml
(preEval [ ../../examples/full-nixos/arion-compose.nix ]).config.out.dockerComposeYaml (preEval [ ../../examples/full-nixos/arion-compose.nix ]).config.out.dockerComposeYaml
(preEval [ ../../examples/nixos-unit/arion-compose.nix ]).config.out.dockerComposeYaml (preEval [ ../../examples/nixos-unit/arion-compose.nix ]).config.out.dockerComposeYaml
(preEval [ ../../examples/traefik/arion-compose.nix ]).config.out.dockerComposeYaml
pkgs.stdenv pkgs.stdenv
]; ];
virtualisation.memorySize = 1024; virtualisation.memorySize = 1024;
}; };
testScript = '' testScript = ''
machine.fail("curl localhost:8000") machine.fail("curl --fail localhost:8000")
machine.succeed("docker --version") machine.succeed("docker --version")
# Tests # Tests
@ -50,11 +51,11 @@ in
machine.succeed( machine.succeed(
"rm -rf work && cp -frT ${../../examples/minimal} work && cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion up -d" "rm -rf work && cp -frT ${../../examples/minimal} work && cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion up -d"
) )
machine.wait_until_succeeds("curl localhost:8000") machine.wait_until_succeeds("curl --fail localhost:8000")
machine.succeed( machine.succeed(
"cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion down" "cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion down"
) )
machine.wait_until_fails("curl localhost:8000") machine.wait_until_fails("curl --fail localhost:8000")
# Tests # Tests
# - arion exec # - arion exec
@ -63,7 +64,7 @@ in
machine.succeed( machine.succeed(
"rm -rf work && cp -frT ${../../examples/full-nixos} work && cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion up -d" "rm -rf work && cp -frT ${../../examples/full-nixos} work && cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion up -d"
) )
machine.wait_until_succeeds("curl localhost:8000") machine.wait_until_succeeds("curl --fail localhost:8000")
machine.succeed( machine.succeed(
""" """
@ -79,7 +80,7 @@ in
machine.succeed( machine.succeed(
"cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion down" "cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion down"
) )
machine.wait_until_fails("curl localhost:8000") machine.wait_until_fails("curl --fail localhost:8000")
# Tests # Tests
# - examples/nixos-unit # - examples/nixos-unit
@ -87,10 +88,23 @@ in
machine.succeed( machine.succeed(
"rm -rf work && cp -frT ${../../examples/nixos-unit} work && cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion up -d" "rm -rf work && cp -frT ${../../examples/nixos-unit} work && cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion up -d"
) )
machine.wait_until_succeeds("curl localhost:8000") machine.wait_until_succeeds("curl --fail localhost:8000")
machine.succeed( machine.succeed(
"cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion down" "cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion down"
) )
machine.wait_until_fails("curl localhost:8000") machine.wait_until_fails("curl --fail localhost:8000")
# Tests
# - examples/traefik
# - labels
with subtest("traefik"):
machine.succeed(
"rm -rf work && cp -frT ${../../examples/traefik} work && cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion up -d"
)
machine.wait_until_succeeds("curl --fail nix-docs.localhost")
machine.succeed(
"cd work && NIX_PATH=nixpkgs='${pkgs.path}' arion down"
)
machine.wait_until_fails("curl --fail nix-docs.localhost")
''; '';
} }