hercules-ci / arion

Run docker-compose with help from Nix/NixOS
Apache License 2.0
622 stars 48 forks source link

services.<name>.service.build.context doesn't work #208

Closed LoveIsGrief closed 1 year ago

LoveIsGrief commented 1 year ago

When setting the option, the resulting docker-compose.yaml always has an image set by services.<name>.service.image.

These lines seem to be the cause https://github.com/hercules-ci/arion/blob/f0436c8478d1b5530c115a6b1202c4478dfe2f81/src/nix/modules/service/image.nix#L167-L177

service.image ends up always being set which also always sets nixBuild - at least that's my evaluation. I tried to make it optional, but failed to set the service.build.... fields :shrug:

diff --git a/src/nix/modules/service/docker-compose-service.nix b/src/nix/modules/service/docker-compose-service.nix
index 061ae8b..c038ac6 100644
--- a/src/nix/modules/service/docker-compose-service.nix
+++ b/src/nix/modules/service/docker-compose-service.nix
@@ -86,7 +86,8 @@ in
       description = serviceRef "environment";
     };
     service.image = mkOption {
-      type = str;
+      type = nullOr str;
+      default = null;
       description = serviceRef "image";
     };
     service.command = mkOption {
@@ -328,8 +329,9 @@ in
       volumes
       environment
       sysctls
-      image
       ;
+  } // lib.optionalAttrs (config.service.image != null) {
+    inherit (config.service) image;
   } // lib.optionalAttrs (config.service.build.context != null) {
     inherit (config.service) build;
   } // lib.optionalAttrs (cap_add != []) {
diff --git a/src/nix/modules/service/image.nix b/src/nix/modules/service/image.nix
index 706a5c1..b6aa289 100644
--- a/src/nix/modules/service/image.nix
+++ b/src/nix/modules/service/image.nix
@@ -163,17 +163,31 @@ in
       '';
     };
   };
-  config = {
-    build.image = builtImage;
-    build.imageName = config.build.image.imageName;
-    build.imageTag =
+  config = let
+
+    image = builtImage;
+    imageName = config.build.image.imageName;
+    imageTag =
                  if config.build.image.imageTag != ""
                  then config.build.image.imageTag
                  else lib.head (lib.strings.splitString "-" (baseNameOf config.build.image.outPath));

-    service.image = lib.mkDefault "${config.build.imageName}:${config.build.imageTag}";
-    image.rawConfig.Cmd = config.image.command;
+    serviceImage = lib.mkDefault "${imageName}:${imageTag}";
+    hasContext = config.service.build.context != null;

-    image.nixBuild = lib.mkDefault (priorityIsDefault options.service.image);
-  };
+  in lib.mkMerge [
+    {
+      build = {
+        inherit image imageName imageTag;
+      };
+      image.rawConfig.Cmd = config.image.command;
+      image.nixBuild = false;
+    }
+    ( lib.mkIf (hasContext == false)
+    {
+      service.image = serviceImage;
+      image.nixBuild = lib.mkDefault (priorityIsDefault options.service.image);
+    })
+  ];
 }

Maybe somebody with more nix and nixpkgs knowledge can help solve this.