{ config, lib, pkgs, ... }: let # Provides a fake "docker" binary mapping to podman cfg = config.services.podman; podmanPackage = cfg.package; docker_host = "unix:///run/user/$UID/podman/podman.sock"; fakeDockerBinary = pkgs.runCommand "${podmanPackage.pname}-docker-compat-${podmanPackage.version}" { outputs = [ "out" "man" ]; inherit (podmanPackage) meta; } '' mkdir -p $out/bin ln -s ${podmanPackage}/bin/podman $out/bin/docker mkdir -p $man/share/man/man1 for f in ${podmanPackage.man}/share/man/man1/*; do basename=$(basename $f | sed s/podman/docker/g) ln -s $f $man/share/man/man1/$basename done ''; dockerComposeCompat = pkgs.runCommand "docker-compose-podman-compat" { buildInputs = [ pkgs.makeWrapper ]; } '' mkdir -p $out/bin makeWrapper '${pkgs.docker-compose}/libexec/docker/cli-plugins/docker-compose' "$out/bin/docker-compose" \ --set-default "DOCKER_HOST" 'unix:///run/user/$UID/podman/podman.sock' \ --set-default DOCKER_BUILDKIT 0 ''; in with lib; { options.services.podman = { dockerCompat = { fakeDockerBinary.enable = mkEnableOption { description = '' Create an alias mapping docker to podman. ''; }; dockerSocket.enable = mkEnableOption { description = '' Set the DOCKER_HOST environment variable to make docker tools use the podman docker ''; }; dockerCompose.enable = mkEnableOption { description = '' Install a docker-compose binary that uses the podman socket ''; }; }; }; config = lib.mkIf cfg.enable (lib.mkMerge [ (lib.mkIf cfg.dockerCompat.fakeDockerBinary.enable { home.packages = [ fakeDockerBinary ]; }) (lib.mkIf cfg.dockerCompat.dockerCompose.enable { home.packages = [ dockerComposeCompat ]; }) (lib.mkIf cfg.dockerCompat.dockerSocket.enable { home.sessionVariables."DOCKER_HOST" = "unix:///run/user/$UID/podman/podman.sock"; }) ]); }