Search code examples
dockernixhasuranixos

NixOS - How to set up local Hasura instance as a declarative container with Docker / Podman virtualisation?


I have NixOS 22.11 set up on a local workstation. I use extra-container, which can run declarative containers without system rebuilds.

Here is my config for hasura.nix. It sets of the postgresql service and Hasura as an oci-container (docker).

{ config, pkgs, ... }:
let
  app = "hasura";
in
{
  containers.hasura = {
    config = {
      services.postgresql = {
        enable = true;
        port = 5433;
        package = pkgs.postgresql;
        enableTCPIP = true;
        authentication = pkgs.lib.mkOverride 10 ''
          local all all trust
          host all all 127.0.0.1/32 trust
          host all all ::1/128 trust
        '';
        initialScript = pkgs.writeText "backend-initScript" ''
          CREATE ROLE postgres WITH LOGIN PASSWORD 'password' CREATEDB;
          CREATE DATABASE "dbname" WITH OWNER "postgres" ENCODING 'UTF8' TEMPLATE template0;
          GRANT ALL PRIVILEGES ON DATABASE dbname TO postgres;
        '';

      };

      virtualisation = {
        docker.enable = true;

        oci-containers.containers = {
          # postgres = {

          #   autoStart = true;
          #   image = "postgres";
          #   # restart = "always";
          #   volumes = [
          #     "db_data:/var/lib/postgresql/data"
          #   ];
          # };
          hasura = {
            autoStart = true;
            image = "hasura/graphql-engine:latest";
            environment = {
              HASURA_GRAPHQL_DATABASE_URL = "postgres://postgress:password@127.0.0.1:5433/dbname";
              HASURA_GRAPHQL_ENABLE_CONSOLE = "true";
            };
            ports = [
              "8080:8080"
            ];
          };
        };
      };
    };
  };
}

I run it with the command:

sudo extra-container create --start <<EOF
 $(cat hasura.nix)
EOF

When i login into the container

sudo extra-container root-login hasura

The command:

systemctl status postgresql

showed that the native postgresql service started successfully

The command:

systemctl status docker

logs the error:

docker.service - Docker Application Container Engine Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: enabled) Drop-In: /nix/store/blsd1fdr41vxc4570rzfib78ldpb8l0v-system-units/docker.service.d
             └─overrides.conf Active: failed (Result: exit-code) since Wed 2023-03-08 00:15:11 CET; 9s ago TriggeredBy: × docker.socket Docs: https://docs.docker.com Process: 354 ExecStart=/nix/store/m66c6m0fxlsrhg3svi9sy1lxvildwf58-docker-20.10.17/bin/dockerd --config-file=/nix/store/9kvb9hikrpnkq88nijp4s6ms97hi6vpx-> Main PID: 354 (code=exited, status=1/FAILURE)

Mar 08 00:15:11 hasura systemd[1]: docker.service: Scheduled restart job, restart counter is at 3. Mar 08 00:15:11 hasura systemd[1]: Stopped Docker Application Container Engine. Mar 08 00:15:11 hasura systemd[1]: docker.service: Start request repeated too quickly. Mar 08 00:15:11 hasura systemd[1]: docker.service: Failed with result 'exit-code'.

I tried to change the virtualisation mode to podman.

      virtualisation = {
        # docker.enable = true;
        podman = {
          enable = true;
          dockerCompat = true;
        };
        oci-containers.backend = "podman";
        oci-containers.containers = {
          hasura = {
            autoStart = true;
            image = "hasura/graphql-engine:latest";
            environment = {
              HASURA_GRAPHQL_DATABASE_URL = "postgres://postgres:password@127.0.0.1:5433/dbname";
              HASURA_GRAPHQL_ENABLE_CONSOLE = "true";
            };
            ports = [
              "8080:8080"
            ];
          };
        };
      };

The command

systemctl status podman-hasura

logs the error:

podman-hasura.service Loaded: loaded (/etc/systemd/system/podman-hasura.service; enabled; vendor pres> Active: failed (Result: exit-code) since Wed 2023-03-08 00:35:51 CET; 1min 17s > Process: 637 ExecStartPre=/nix/store/hkyh5rj067rsgh1cnx1nnycsv6s7pk6r-unit-scrip> Process: 647 ExecStart=/nix/store/p2pwaa7scqiv352lnbyh6br12p8cphy0-unit-script-p> Process: 683 ExecStopPost=/nix/store/1iwwdwhvm689qsfj3map1gzx5hph7ywb-unit-scrip> Main PID: 647 (code=exited, status=126)

Mar 08 00:35:51 hasura systemd[1]: podman-hasura.service: Scheduled restart job, res> Mar 08 00:35:51 hasura systemd[1]: Stopped podman-hasura.service. Mar 08 00:35:51 hasura systemd[1]: podman-hasura.service: Start request repeated too> Mar 08 00:35:51 hasura systemd[1]: podman-hasura.service: Failed with result 'exit-c> Mar 08 00:35:51 hasura systemd[1]: Failed to start podman-hasura.service. lines 1-13/13 (END)

The command

journalctl -u podman-hasura

logs:

Mar 08 13:22:08 hasura systemd[1]: Starting podman-hasura.service...
Mar 08 13:22:08 hasura podman[193]: 2023-03-08 13:22:08.974337184 +0100 CET m=+0.842361173 system refresh
Mar 08 13:22:09 hasura systemd[1]: Started podman-hasura.service.
Mar 08 13:22:09 hasura podman-hasura-start[280]: Resolving "hasura/graphql-engine" using unqualified-search registries (/etc/containers/registries.conf)
Mar 08 13:22:09 hasura podman-hasura-start[280]: Trying to pull docker.io/hasura/graphql-engine:latest...
Mar 08 13:22:11 hasura podman-hasura-start[280]: Getting image source signatures
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:7608715873ec5c02d370e963aa9b19a149023ce218887221d93fe671b3abbf58
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:99b52f18fc1470484494d8343f0b7304ad5a2076def4d047733e8df09d177391
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:747f55337f880a27b204c974aed75efe5a3955615acc104068caee742015dfad
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:6435e97c6a55d3712cf718f2690895b57b56483945130bb75a019827d59eb78d
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:6e594de10781a6c3bbde9994cdacbdfaccc63b76afc775378c4c521893a3e2d5
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:4a0d8df7d2cabd10ce2e41fcc284de17c37238c5b1f86edabd596a027cfaa581
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:0c4c773484760971069e2de813dab13f2a09c745c1ef2436318906aeac406e7d
Mar 08 13:22:12 hasura podman-hasura-start[280]: Copying blob sha256:141b63796c223137e9ceed83507c78dd07c1e21b662c0dc45ef685345ad1e3ca
Mar 08 13:22:21 hasura podman-hasura-start[280]: Copying config sha256:c7e4959a8d1d0d105e07ef57bedc06dc061202942a3264e838188408b62dbee4
Mar 08 13:22:21 hasura podman-hasura-start[280]: Writing manifest to image destination
Mar 08 13:22:21 hasura podman-hasura-start[280]: Storing signatures
Mar 08 13:22:21 hasura podman-hasura-start[280]: Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded.
lines 1-18...skipping...
Mar 08 13:22:08 hasura systemd[1]: Starting podman-hasura.service...
Mar 08 13:22:08 hasura podman[193]: 2023-03-08 13:22:08.974337184 +0100 CET m=+0.842361173 system refresh
Mar 08 13:22:09 hasura systemd[1]: Started podman-hasura.service.
Mar 08 13:22:09 hasura podman-hasura-start[280]: Resolving "hasura/graphql-engine" using unqualified-search registries (/etc/containers/registries.conf)
Mar 08 13:22:09 hasura podman-hasura-start[280]: Trying to pull docker.io/hasura/graphql-engine:latest...
Mar 08 13:22:11 hasura podman-hasura-start[280]: Getting image source signatures
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:7608715873ec5c02d370e963aa9b19a149023ce218887221d93fe671b3abbf58
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:99b52f18fc1470484494d8343f0b7304ad5a2076def4d047733e8df09d177391
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:747f55337f880a27b204c974aed75efe5a3955615acc104068caee742015dfad
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:6435e97c6a55d3712cf718f2690895b57b56483945130bb75a019827d59eb78d
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:6e594de10781a6c3bbde9994cdacbdfaccc63b76afc775378c4c521893a3e2d5
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:4a0d8df7d2cabd10ce2e41fcc284de17c37238c5b1f86edabd596a027cfaa581
Mar 08 13:22:11 hasura podman-hasura-start[280]: Copying blob sha256:0c4c773484760971069e2de813dab13f2a09c745c1ef2436318906aeac406e7d
Mar 08 13:22:12 hasura podman-hasura-start[280]: Copying blob sha256:141b63796c223137e9ceed83507c78dd07c1e21b662c0dc45ef685345ad1e3ca
Mar 08 13:22:21 hasura podman-hasura-start[280]: Copying config sha256:c7e4959a8d1d0d105e07ef57bedc06dc061202942a3264e838188408b62dbee4
Mar 08 13:22:21 hasura podman-hasura-start[280]: Writing manifest to image destination
Mar 08 13:22:21 hasura podman-hasura-start[280]: Storing signatures
Mar 08 13:22:21 hasura podman-hasura-start[280]: Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded.
Mar 08 13:22:21 hasura podman[280]: 
Mar 08 13:22:21 hasura podman[280]: 2023-03-08 13:22:21.951471627 +0100 CET m=+12.863705764 container create 4090752672f577708a9ba6def166c33877e71095b1ddc86813e015be278caf58 (im>
Mar 08 13:22:21 hasura podman[280]: 2023-03-08 13:22:09.129371697 +0100 CET m=+0.041605829 image pull  hasura/graphql-engine:latest
Mar 08 13:22:22 hasura podman[280]: 2023-03-08 13:22:22.013865478 +0100 CET m=+12.926099609 container remove 4090752672f577708a9ba6def166c33877e71095b1ddc86813e015be278caf58 (im>
Mar 08 13:22:22 hasura podman-hasura-start[280]: Error: failed to set the loopback adapter up: operation not permitted
Mar 08 13:22:22 hasura systemd[1]: podman-hasura.service: Main process exited, code=exited, status=126/n/a
Mar 08 13:22:22 hasura systemd[1]: podman-hasura.service: Failed with result 'exit-code'.
Mar 08 13:22:22 hasura systemd[1]: podman-hasura.service: Scheduled restart job, restart counter is at 1.
Mar 08 13:22:22 hasura systemd[1]: Stopped podman-hasura.service.
Mar 08 13:22:22 hasura systemd[1]: Starting podman-hasura.service...
Mar 08 13:22:22 hasura systemd[1]: Started podman-hasura.service.
Mar 08 13:22:22 hasura podman-hasura-start[426]: Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded.
Mar 08 13:22:22 hasura podman[426]: 
Mar 08 13:22:22 hasura podman[426]: 2023-03-08 13:22:22.656601574 +0100 CET m=+0.076134660 container create 691f40efe797c2b94fed98652c4a0a5c00f6a90ebe35d3744a3f57d3ea57e4dc (ima>
Mar 08 13:22:22 hasura podman[426]: 2023-03-08 13:22:22.708566909 +0100 CET m=+0.128099996 container remove 691f40efe797c2b94fed98652c4a0a5c00f6a90ebe35d3744a3f57d3ea57e4dc (ima>
Mar 08 13:22:22 hasura podman-hasura-start[426]: Error: failed to set the loopback adapter up: operation not permitted
Mar 08 13:22:22 hasura systemd[1]: podman-hasura.service: Main process exited, code=exited, status=126/n/a
Mar 08 13:22:22 hasura systemd[1]: podman-hasura.service: Failed with result 'exit-code'.
Mar 08 13:22:23 hasura systemd[1]: podman-hasura.service: Scheduled restart job, restart counter is at 2.
Mar 08 13:22:23 hasura systemd[1]: Stopped podman-hasura.service.
Mar 08 13:22:23 hasura systemd[1]: Starting podman-hasura.service...
Mar 08 13:22:23 hasura systemd[1]: Started podman-hasura.service.
Mar 08 13:22:23 hasura podman-hasura-start[482]: Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded.
Mar 08 13:22:23 hasura podman[482]: 
Mar 08 13:22:23 hasura podman[482]: 2023-03-08 13:22:23.417280498 +0100 CET m=+0.082720730 container create 2a62e1e82bebb12789537c2beb52cd8bf5f3cb03841cde881468245cf5949897 (ima>
Mar 08 13:22:23 hasura podman[482]: 2023-03-08 13:22:23.362801125 +0100 CET m=+0.028241351 image pull  hasura/graphql-engine:latest
Mar 08 13:22:23 hasura podman[482]: 2023-03-08 13:22:23.464525957 +0100 CET m=+0.129966187 container remove 2a62e1e82bebb12789537c2beb52cd8bf5f3cb03841cde881468245cf5949897 (ima>
Mar 08 13:22:23 hasura podman-hasura-start[482]: Error: failed to set the loopback adapter up: operation not permitted
Mar 08 13:22:23 hasura systemd[1]: podman-hasura.service: Main process exited, code=exited, status=126/n/a
Mar 08 13:22:23 hasura systemd[1]: podman-hasura.service: Failed with result 'exit-code'.
Mar 08 13:22:23 hasura systemd[1]: podman-hasura.service: Scheduled restart job, restart counter is at 3.
Mar 08 13:22:23 hasura systemd[1]: Stopped podman-hasura.service.
Mar 08 13:22:23 hasura systemd[1]: Starting podman-hasura.service...
Mar 08 13:22:24 hasura systemd[1]: Started podman-hasura.service.
Mar 08 13:22:24 hasura podman-hasura-start[538]: Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded.
Mar 08 13:22:24 hasura podman[538]: 
Mar 08 13:22:24 hasura podman[538]: 2023-03-08 13:22:24.179815741 +0100 CET m=+0.088731970 container create ec7eee8eec9f8327da631b220f81ad4b273f8c03ed8123bfb5abd333e4625468 (ima>
Mar 08 13:22:24 hasura podman[538]: 2023-03-08 13:22:24.124300322 +0100 CET m=+0.033216559 image pull  hasura/graphql-engine:latest
Mar 08 13:22:24 hasura podman[538]: 2023-03-08 13:22:24.310644903 +0100 CET m=+0.219561125 container remove ec7eee8eec9f8327da631b220f81ad4b273f8c03ed8123bfb5abd333e4625468 (ima>
Mar 08 13:22:24 hasura podman-hasura-start[538]: Error: failed to set the loopback adapter up: operation not permitted
Mar 08 13:22:24 hasura systemd[1]: podman-hasura.service: Main process exited, code=exited, status=126/n/a
Mar 08 13:22:24 hasura systemd[1]: podman-hasura.service: Failed with result 'exit-code'.
Mar 08 13:22:24 hasura systemd[1]: podman-hasura.service: Scheduled restart job, restart counter is at 4.
Mar 08 13:22:24 hasura systemd[1]: Stopped podman-hasura.service.
Mar 08 13:22:24 hasura systemd[1]: Starting podman-hasura.service...
Mar 08 13:22:24 hasura systemd[1]: Started podman-hasura.service.
Mar 08 13:22:24 hasura podman-hasura-start[595]: Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded.
Mar 08 13:22:24 hasura podman[595]: 
Mar 08 13:22:24 hasura podman[595]: 2023-03-08 13:22:24.922071766 +0100 CET m=+0.080850099 container create 988e8f863828150337dbb2ec0eb36a79893af35d5a825424fa2b2dbbabe29193 (ima>
Mar 08 13:22:24 hasura podman[595]: 2023-03-08 13:22:24.873384205 +0100 CET m=+0.032162540 image pull  hasura/graphql-engine:latest
Mar 08 13:22:24 hasura podman[595]: 2023-03-08 13:22:24.975337512 +0100 CET m=+0.134115836 container remove 988e8f863828150337dbb2ec0eb36a79893af35d5a825424fa2b2dbbabe29193 (ima>
Mar 08 13:22:24 hasura podman-hasura-start[595]: Error: failed to set the loopback adapter up: operation not permitted
Mar 08 13:22:24 hasura systemd[1]: podman-hasura.service: Main process exited, code=exited, status=126/n/a
Mar 08 13:22:25 hasura systemd[1]: podman-hasura.service: Failed with result 'exit-code'.
Mar 08 13:22:25 hasura systemd[1]: podman-hasura.service: Scheduled restart job, restart counter is at 5.
Mar 08 13:22:25 hasura systemd[1]: Stopped podman-hasura.service.
Mar 08 13:22:25 hasura systemd[1]: Starting podman-hasura.service...
Mar 08 13:22:25 hasura systemd[1]: Started podman-hasura.service.
Mar 08 13:22:25 hasura podman-hasura-start[650]: Your kernel does not support pids limit capabilities or the cgroup is not mounted. PIDs limit discarded.
Mar 08 13:22:25 hasura podman[650]: 
Mar 08 13:22:25 hasura podman[650]: 2023-03-08 13:22:25.716497452 +0100 CET m=+0.086217175 container create 4bbe66682989e3f1bafc3bb87df90b8309e03a0ed68327bd80e2c5dfdcc1a72c (ima>
Mar 08 13:22:25 hasura podman[650]: 2023-03-08 13:22:25.670100691 +0100 CET m=+0.039820414 image pull  hasura/graphql-engine:latest
Mar 08 13:22:26 hasura podman[650]: 2023-03-08 13:22:26.123131219 +0100 CET m=+0.492850941 container remove 4bbe66682989e3f1bafc3bb87df90b8309e03a0ed68327bd80e2c5dfdcc1a72c (ima>
Mar 08 13:22:26 hasura podman-hasura-start[650]: Error: failed to set the loopback adapter up: operation not permitted
Mar 08 13:22:26 hasura systemd[1]: podman-hasura.service: Main process exited, code=exited, status=126/n/a
Mar 08 13:22:26 hasura systemd[1]: podman-hasura.service: Failed with result 'exit-code'.
Mar 08 13:22:26 hasura systemd[1]: podman-hasura.service: Scheduled restart job, restart counter is at 6.
Mar 08 13:22:26 hasura systemd[1]: Stopped podman-hasura.service.
Mar 08 13:22:26 hasura systemd[1]: podman-hasura.service: Start request repeated too quickly.
Mar 08 13:22:26 hasura systemd[1]: podman-hasura.service: Failed with result 'exit-code'.
Mar 08 13:22:26 hasura systemd[1]: Failed to start podman-hasura.service.

When i remove the wrapper extra-container and move the config directly to my main configuration and rebuild the system with

sudo nixos-rebuild switch --flake .#desktop      

i tried to run postgres container only but it failed.

podman-postgres.service
     Loaded: loaded (/etc/systemd/system/podman-postgres.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Wed 2023-03-08 17:40:28 CET; 605ms ago
   Duration: 76ms
    Process: 3323975 ExecStartPre=/nix/store/ngrp9c03jma5dcdpx0hwplgivccyglhw-unit-script-podman-postgres-pre-start/bin/podman-postgres-pre-start (code=exited, status=0/SUCCESS)
    Process: 3323987 ExecStart=/nix/store/p8h161jslcq8xpypjbxdvb3m89ql7c5w-unit-script-podman-postgres-start/bin/podman-postgres-start (code=exited, status=125)
    Process: 3324023 ExecStopPost=/nix/store/adsw00cli3sicz17z7bvfm300wlaljf7-unit-script-podman-postgres-post-stop/bin/podman-postgres-post-stop (code=exited, status=0/SUCCESS)
   Main PID: 3323987 (code=exited, status=125)
         IP: 0B in, 0B out
        CPU: 169ms

mar 08 17:40:28 nixos systemd[1]: podman-postgres.service: Scheduled restart job, restart counter is at 5.
mar 08 17:40:28 nixos systemd[1]: Stopped podman-postgres.service.
mar 08 17:40:28 nixos systemd[1]: podman-postgres.service: Start request repeated too quickly.
mar 08 17:40:28 nixos systemd[1]: podman-postgres.service: Failed with result 'exit-code'.
mar 08 17:40:28 nixos systemd[1]: Failed to start podman-postgres.service.                                                                                                   /0,0s

However, when i use podman-run directly form terminal it is working.

podman run --name postgres -e POSTGRES_PASSWORD=password -d postgres:latest
podman run --name hasura -d -p 8080:8080 \                        
  -e HASURA_GRAPHQL_DATABASE_URL=postgres://postgres:password@10.89.0.2:5432/postgres \
  -e HASURA_GRAPHQL_ENABLE_CONSOLE=true \
  hasura/graphql-engine:latest

What should i change in my declarative container config to fix the error and enable Hasura container?


Solution

  • I managed to get the working declarative setup for hasura without extra-container, so far. I created additional systemd service podman-create-pod with the option serviceConfig.Type = "oneshot"; which creates the common pod for both containers hasura & postgres

    { config, pkgs, user, ... }:
    let
      podman = pkgs.podman;
    in
    {
      systemd.services.podman-create-pod = {
            serviceConfig.Type = "oneshot";
            wantedBy = [ "multi-user.target" ];
            script = ''
              ${podman}/bin/podman pod exists hasura-pg || \
                ${podman}/bin/podman pod create -n hasura-pg -p '127.0.0.1:8080:8080'
        
            '';
          };
          
      virtualisation = {
        podman = {
          enable = true;
          # dockerCompat = true;
        };
        oci-containers = {
          backend = "podman";
        };
      };
    
      virtualisation.oci-containers.containers = {
        pg2 = {
          autoStart = true;
          image = "postgres:latest";
          # pod = "hasura-pod";
          # dependsOn = [ "podman-create-pod-postgres" ];
          environment = {
            POSTGRES_PASSWORD = "password";
            POSTGRES_USER = "postgres";
            POSTGRES_DB = "postgres";
          };
          volumes = [ "postgresql:/var/lib/postgresql/data" ];
        };
        hasura = {
          autoStart = true;
          image = "hasura/graphql-engine:latest";
          # pod = "hasura-pod";
          dependsOn = [ "pg2" ];
          ports = [ "8080:8080" ];
          environment = {
            HASURA_GRAPHQL_DATABASE_URL = "postgres://postgres:password@10.88.0.13:5432/postgres";
            HASURA_GRAPHQL_ENABLE_CONSOLE = "true";
          };
        };
    
      };
    
      users.groups.docker.members = [ "${user}" ];
    
      environment.systemPackages = with pkgs; [
        docker-compose
        docker-client
      ];
    }
    

    For the postgres address in hasura config i used the pg2 container ip obtained with:

     sudo podman inspect -f '{{.NetworkSettings.IPAddress}}' pg2