commit
c605eac50f
8 changed files with 120 additions and 42 deletions
|
@ -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`.
|
||||||
|
|
|
@ -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]
|
||||||
|
|
49
examples/traefik/arion-compose.nix
Normal file
49
examples/traefik/arion-compose.nix
Normal 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";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
6
examples/traefik/arion-pkgs.nix
Normal file
6
examples/traefik/arion-pkgs.nix
Normal 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";
|
||||||
|
}
|
12
nix/ci.nix
12
nix/ci.nix
|
@ -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;
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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 != []) {
|
||||||
|
|
|
@ -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")
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue