2022-10-29 13:39:02 +02:00
{ piholeFlake , lingerFlake }: { config , pkgs , lib , . . . }: with lib ; with builtins ; let
2022-10-31 01:13:22 +01:00
inherit ( import ../lib/util.nix ) extractContainerEnvVars extractContainerFTLEnvVars ;
2022-12-03 23:07:47 +01:00
mkContainerEnvOption = { envVar , . . . } @ optionAttrs :
( mkOption ( removeAttrs optionAttrs [ " e n v V a r " ] ) )
// { inherit envVar ; } ;
2022-10-14 01:33:19 +02:00
2022-10-09 19:57:58 +02:00
cfg = config . services . pihole ;
2022-10-22 15:47:37 +02:00
hostUserCfg = config . users . users . ${ cfg . hostConfig . user } ;
2024-12-04 23:11:49 +01:00
tmpDirIsResetAtBoot = config . boot . tmp . cleanOnBoot || config . boot . tmp . useTmpfs ;
2022-10-14 01:33:19 +02:00
systemTimeZone = config . time . timeZone ;
defaultPiholeVolumesDir = " ${ config . users . users . ${ cfg . hostConfig . user } . home } / p i h o l e - v o l u m e s " ;
in rec {
2022-10-04 00:19:12 +02:00
options = {
2022-10-09 19:57:58 +02:00
services . pihole = {
2022-10-04 00:19:12 +02:00
enable = mkEnableOption " P i H o l e a s a r o o t l e s s p o d m a n c o n t a i n e r " ;
hostConfig = {
user = mkOption {
type = types . str ;
description = ''
The username of the user on the host which should run the pihole container .
Needs to be able to run rootless podman .
'' ;
} ;
2022-10-22 15:47:37 +02:00
enableLingeringForUser = mkOption {
type = with types ; oneOf [ bool ( enum [ " s u p p r e s s W a r n i n g " ] ) ] ;
description = ''
If true lingering ( see ` loginctl enable-linger ` ) is enabled for the host user running pihole .
This is necessary as otherwise starting the pihole container will fail if there is no active session for the host user .
If false a warning is printed during the build to remind you of the issue .
Set to " s u p p r e s s W a r n i n g " if the issue is solved otherwise or does not apply .
'' ;
default = false ;
} ;
2022-10-17 01:17:29 +02:00
containerName = mkOption {
type = types . str ;
description = ''
The name of the podman container in which pihole will be started .
'' ;
default = " p i h o l e _ ${ cfg . hostConfig . user } " ;
} ;
2022-10-14 01:33:19 +02:00
persistVolumes = mkOption {
type = types . bool ;
description = " W h e t h e r t o u s e p o d m a n v o l u m e s t o p e r s i s t p i h o l e ' s a d - h o c c o n f i g u r a t i o n a c r o s s r e s t a r t s . " ;
default = false ;
} ;
2022-10-04 00:19:12 +02:00
volumesPath = mkOption {
2022-10-14 01:33:19 +02:00
type = types . str ;
2022-10-04 00:19:12 +02:00
description = ''
The path where the persistent data of the pihole container should be stored .
The different used volumes are created automatically .
Needs to be writable by the user running the pihole container .
'' ;
2022-10-14 01:33:19 +02:00
default = defaultPiholeVolumesDir ;
example = " / h o m e / p i h o l e - u s e r / p i h o l e - v o l u m e s " ;
2022-10-04 00:19:12 +02:00
} ;
2022-12-03 23:07:47 +01:00
dnsPort = mkOption {
type = with types ; nullOr ( either port str ) ;
description = ''
THe port on which PiHole's DNS service shoud be exposed .
Either pass a port number as integer or a string in the format ` ip:port ` ( see [ Docker docs ] ( https://docs.docker.com/engine/reference/run/ #expose-incoming-ports) for details).
If this option is not specified the DNS service will not be exposed on the host .
Remember that if the container is running rootless exposing on a privileged port is not possible .
'' ;
default = null ;
2022-10-04 00:19:12 +02:00
} ;
2022-12-03 23:07:47 +01:00
dhcpPort = mkOption {
type = with types ; nullOr ( either port str ) ;
description = ''
THe port on which PiHole's DHCP service shoud be exposed .
Either pass a port number as integer or a string in the format ` ip:port ` ( see [ Docker docs ] ( https://docs.docker.com/engine/reference/run/ #expose-incoming-ports) for details).
If this option is not specified the DHCP service will not be exposed on the host .
Remember that if the container is running rootless exposing on a privileged port is not possible .
'' ;
default = null ;
2022-10-04 00:19:12 +02:00
} ;
2022-12-03 23:07:47 +01:00
webPort = mkOption {
type = with types ; nullOr ( either port str ) ;
description = ''
THe port on which PiHole's web interface shoud be exposed .
Either pass a port number as integer or a string in the format ` ip:port ` ( see [ Docker docs ] ( https://docs.docker.com/engine/reference/run/ #expose-incoming-ports) for details).
If this option is not specified the web interface will not be exposed on the host .
Remember that if the container is running rootless exposing on a privileged port is not possible .
'' ;
default = null ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-29 23:59:09 +02:00
suppressTmpDirWarning = mkOption {
type = types . bool ;
description = ''
Set to ` true ` if you have taken precautions s . t . rootless podman does not leave traces in ` /tmp ` .
Failing to do so can cause rootless podman to fail to start at reboot ( see https://github.com/containers/podman/issues/4057 ) .
2024-12-04 23:11:49 +01:00
If ` boot . tmp . cleanOnBoot ` or ` boot . tmp . useTmpfs ` is set then you do not have to set this option .
2022-10-29 23:59:09 +02:00
'' ;
default = false ;
} ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-29 14:09:43 +02:00
piholeConfig = {
2022-10-14 01:33:19 +02:00
tz = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . str ;
description = " S e t y o u r t i m e z o n e t o m a k e s u r e l o g s r o t a t e a t l o c a l m i d n i g h t i n s t e a d o f a t U T C m i d n i g h t . " ;
2022-10-14 01:33:19 +02:00
default = systemTimeZone ;
envVar = " T Z " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-30 00:12:51 +02:00
interface = mkContainerEnvOption {
type = types . str ;
description = ''
Set the interface of the pihole container on which it should respond to DNS requests .
Note : Configuring " A l l o w o n l y l o c a l r e q u e s t s " is currently not supported by the pihole image at startup but can be done later through the web interface .
'' ;
default = " t a p 0 " ;
envVar = " I N T E R F A C E " ;
} ;
2022-10-04 00:19:12 +02:00
web = {
2022-10-14 01:33:19 +02:00
password = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = with types ; nullOr str ;
description = ''
The password for the pihole admin interface .
If not given a random password will be generated an can be retrieved from the service logs .
'' ;
default = null ;
2022-10-14 01:33:19 +02:00
envVar = " W E B P A S S W O R D " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
# TODO password-file
2022-10-04 00:19:12 +02:00
2022-10-14 01:33:19 +02:00
virtualHost = mkContainerEnvOption {
type = types . str ;
2022-10-04 00:19:12 +02:00
description = " W h a t y o u r w e b s e r v e r ' v i r t u a l h o s t ' i s , a c c e s s i n g a d m i n t h r o u g h t h i s H o s t n a m e / I P a l l o w s y o u t o m a k e c h a n g e s t o t h e w h i t e l i s t / b l a c k l i s t s i n a d d i t i o n t o t h e d e f a u l t ' h t t p : / / p i . h o l e / a d m i n / ' a d d r e s s " ;
2022-10-14 01:33:19 +02:00
envVar = " V I R T U A L _ H O S T " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
layout = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . enum [ " b o x e d " " t r a d i t i o n a l " ] ;
description = " U s e b o x e d l a y o u t ( h e l p f u l w h e n w o r k i n g o n l a r g e s c r e e n s ) " ;
default = " b o x e d " ;
2022-10-14 01:33:19 +02:00
envVar = " W E B U I B O X E D L A Y O U T " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
theme = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . enum [ " d e f a u l t - d a r k " " d e f a u l t - d a r k e r " " d e f a u l t - l i g h t " " d e f a u l t - a u t o " " l c a r s " ] ;
description = " U s e r i n t e r f a c e t h e m e t o u s e . " ;
default = " d e f a u l t - l i g h t " ;
2022-10-14 01:33:19 +02:00
envVar = " W E B T H E M E " ;
2022-10-04 00:19:12 +02:00
} ;
} ;
dns = {
2022-10-14 01:33:19 +02:00
upstreamServers = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = with types ; nullOr ( listOf str ) ;
description = ''
Upstream DNS server ( s ) for Pi-hole to forward queries to .
( supports non-standard ports with #[port number]) e.g [ "127.0.0.1#5053" "8.8.8.8" "8.8.4.4" ]
( supports Docker service names and links instead of IPs ) e . g [ " u p s t r e a m 0 " " u p s t r e a m 1 " ] where upstream0 and upstream1 are the service names of or links to docker services .
Note : The existence of this environment variable assumes this as the sole management of upstream DNS .
Upstream DNS added via the web interface will be overwritten on container restart/recreation.
'' ;
default = null ;
2022-10-14 01:33:19 +02:00
envVar = " P I H O L E _ D N S _ " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
dnssec = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . bool ;
description = " E n a b l e D N S S E C s u p p o r t " ;
default = false ;
2022-10-14 01:33:19 +02:00
envVar = " D N S S E C " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
bogusPriv = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . bool ;
description = " N e v e r f o r w a r d r e v e r s e l o o k u p s f o r p r i v a t e r a n g e s . " ;
default = true ;
2022-10-14 01:33:19 +02:00
envVar = " D N S _ B O G U S _ P R I V " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
fqdnRequired = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . bool ;
description = " N e v e r f o r w a r d n o n - F Q D N s . " ;
default = true ;
2022-10-14 01:33:19 +02:00
envVar = " D N S _ F Q D N _ R E Q U I R E D " ;
2022-10-04 00:19:12 +02:00
} ;
} ;
revServer = {
2022-10-14 01:33:19 +02:00
enable = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . bool ;
description = " E n a b l e D N S c o n d i t i o n a l f o r w a r d i n g f o r d e v i c e n a m e r e s o l u t i o n . " ;
default = false ;
2022-10-14 01:33:19 +02:00
envVar = " R E V _ S E R V E R " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
domain = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = with types ; nullOr str ;
description = " I f c o n d i t i o n a l f o r w a r d i n g i s e n a b l e d , s e t t h e d o m a i n o f t h e l o c a l n e t w o r k r o u t e r . " ;
default = null ;
2022-10-14 01:33:19 +02:00
envVar = " R E V _ S E R V E R _ D O M A I N " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
target = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = with types ; nullOr str ;
description = " I f c o n d i t i o n a l f o r w a r d i n g i s e n a b l e d , s e t t h e I P o f t h e l o c a l n e t w o r k r o u t e r . " ;
default = null ;
2022-10-14 01:33:19 +02:00
envVar = " R E V _ S E R V E R _ T A R G E T " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
cidr = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = with types ; nullOr str ;
description = " I f c o n d i t i o n a l f o r w a r d i n g i s e n a b l e d , s e t t h e r e v e r s e D N S z o n e ( e . g . 1 9 2 . 1 6 8 . 0 . 0 / 2 4 ) " ;
default = null ;
2022-10-14 01:33:19 +02:00
envVar = " R E V _ S E R V E R _ C I D R " ;
2022-10-04 00:19:12 +02:00
} ;
} ;
2022-10-31 01:13:22 +01:00
ftl = mkOption {
type = with types ; attrsOf str ;
description = ''
Set any additional FTL option under this key .
You can find the different options in the pihole docs : https://docs.pi-hole.net/ftldns/configfile
The names should be exactly like in the pihole docs .
'' ;
example = { LOCAL_IPV4 = " 1 9 2 . 1 6 8 . 0 . 1 0 0 " ; } ;
default = { } ;
} ;
2022-10-04 00:19:12 +02:00
dhcp = {
2022-10-14 01:33:19 +02:00
enable = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . bool ;
description = ''
Enable DHCP server .
Static DHCP leases can be configured with a custom /etc/dnsmasq.d/04-pihole-static-dhcp.conf
'' ;
default = false ;
2022-10-14 01:33:19 +02:00
envVar = " D H C P _ A C T I V E " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
start = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = with types ; nullOr str ;
description = " S t a r t o f t h e r a n g e o f I P a d d r e s s e s t o h a n d o u t b y t h e D H C P s e r v e r ( m a n d a t o r y i f D H C P s e r v e r i s e n a b l e d ) . " ;
default = null ;
example = " 1 9 2 . 1 6 8 . 0 . 1 0 " ;
2022-10-14 01:33:19 +02:00
envVar = " D H C P _ S T A R T " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
end = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = with types ; nullOr str ;
description = " E n d o f t h e r a n g e o f I P a d d r e s s e s t o h a n d o u t b y t h e D H C P s e r v e r ( m a n d a t o r y i f D H C P s e r v e r i s e n a b l e d ) . " ;
default = null ;
example = " 1 9 2 . 1 6 8 . 0 . 2 0 " ;
2022-10-14 01:33:19 +02:00
envVar = " D H C P _ E N D " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
router = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = with types ; nullOr str ;
description = " R o u t e r ( g a t e w a y ) I P a d d r e s s s e n t b y t h e D H C P s e r v e r ( m a n d a t o r y i f D H C P s e r v e r i s e n a b l e d ) . " ;
default = null ;
example = " 1 9 2 . 1 6 8 . 0 . 1 " ;
2022-10-14 01:33:19 +02:00
envVar = " D H C P _ R O U T E R " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
leasetime = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . int ;
description = " D H C P l e a s e t i m e i n h o u r s . " ;
default = 24 ;
2022-10-14 01:33:19 +02:00
envVar = " D H C P _ L E A S E T I M E " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
domain = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . str ;
description = " D o m a i n n a m e s e n t b y t h e D H C P s e r v e r . " ;
default = " l a n " ;
2022-10-14 01:33:19 +02:00
envVar = " P I H O L E _ D O M A I N " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
ipv6 = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . bool ;
description = " E n a b l e D H C P s e r v e r I P v 6 s u p p o r t ( S L A A C + R A ) . " ;
default = false ;
2022-10-14 01:33:19 +02:00
envVar = " D H C P _ I P v 6 " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
rapid-commit = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . bool ;
description = " E n a b l e D H C P v 4 r a p i d c o m m i t ( f a s t a d d r e s s a s s i g n m e n t ) . " ;
default = false ;
2022-10-14 01:33:19 +02:00
envVar = " D H C P _ r a p i d _ c o m m i t " ;
2022-10-04 00:19:12 +02:00
} ;
} ;
2022-10-14 01:33:19 +02:00
queryLogging = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . bool ;
description = " E n a b l e q u e r y l o g g i n g o r n o t . " ;
default = true ;
2022-10-14 01:33:19 +02:00
envVar = " Q U E R Y _ L O G G I N G " ;
2022-10-04 00:19:12 +02:00
} ;
2022-10-14 01:33:19 +02:00
temperatureUnit = mkContainerEnvOption {
2022-10-04 00:19:12 +02:00
type = types . enum [ " c " " k " " f " ] ;
description = " S e t p r e f e r r e d t e m p e r a t u r e u n i t t o c : C e l s i u s , k : K e l v i n , o r f F a h r e n h e i t u n i t s . " ;
default = " c " ;
2022-10-14 01:33:19 +02:00
envVar = " T E M P E R A T U R E U N I T " ;
2022-10-04 00:19:12 +02:00
} ;
} ;
} ;
} ;
2022-10-09 19:05:10 +02:00
config = mkIf cfg . enable {
2022-10-22 15:47:07 +02:00
2022-10-22 15:47:37 +02:00
assertions = [
2024-12-04 23:09:00 +01:00
{ assertion = ( length hostUserCfg . subUidRanges > 0 && length hostUserCfg . subGidRanges > 0 ) || hostUserCfg . autoSubUidGidRange = = true ;
2022-10-22 15:47:07 +02:00
message = ''
2024-12-04 23:09:00 +01:00
The host user must have configured subUidRanges & subGidRanges as pihole is running in a rootless podman container .
2022-10-22 15:47:07 +02:00
'' ;
}
] ;
2022-10-23 23:12:51 +02:00
warnings = ( optional ( cfg . hostConfig . enableLingeringForUser = = false ) ''
If lingering is not enabled for the host user which is running the pihole container then he service might be stopped when no user session is active .
2022-10-29 23:59:09 +02:00
Set ` services . pihole . hostConfig . enableLingeringForUser ` to ` true ` to manage systemd's linger setting through the ` linger-flake ` dependency .
2022-10-23 23:12:51 +02:00
Set it to " s u p p r e s s W a r n i n g " if you manage lingering in a different way .
2022-10-29 23:59:09 +02:00
'' ) + + ( o p t i o n a l ( ! t m p D i r I s R e s e t A t B o o t & & ! c f g . h o s t C o n f i g . s u p p r e s s T m p D i r W a r n i n g ) ''
Rootless podman can leave traces in ` /tmp ` after shutdown which can break the startup of new containers at the next boot .
See https://github.com/containers/podman/issues/4057 for details .
To avoid problems consider to clean ` /tmp ` of any left-overs from podman before the next startup .
2024-12-04 23:11:49 +01:00
The NixOS config options ` boot . tmp . cleanOnBoot ` or ` boot . tmp . useTmpfs ` can be helpful .
2022-10-29 23:59:09 +02:00
Enabling either of these disables this warning .
Otherwise you can also set ` services . pihole . hostConfig . suppressTmpDirWarning ` to ` true ` to disable the warning .
2022-10-23 23:12:51 +02:00
'' ) ;
2022-10-28 18:51:18 +02:00
services . linger = mkIf ( cfg . hostConfig . enableLingeringForUser = = true ) {
enable = true ;
users = [ cfg . hostConfig . user ] ;
} ;
2022-10-09 19:05:10 +02:00
systemd . services . " p i h o l e - r o o t l e s s - c o n t a i n e r " = {
2022-10-14 01:34:29 +02:00
wantedBy = [ " m u l t i - u s e r . t a r g e t " ] ;
after = [ " n e t w o r k - o n l i n e . t a r g e t " ] ;
2022-10-17 00:52:35 +02:00
requires = [ " n e t w o r k - o n l i n e . t a r g e t " ] ;
2022-10-14 01:34:29 +02:00
2022-10-15 21:09:27 +02:00
# required to make `newuidmap` available to the systemd service (see https://github.com/NixOS/nixpkgs/issues/138423)
path = [ " / r u n / w r a p p e r s " ] ;
2022-10-14 01:34:29 +02:00
serviceConfig = let
2022-10-29 14:09:43 +02:00
containerEnvVars = extractContainerEnvVars options . services . pihole cfg ;
2022-10-31 01:13:22 +01:00
containerFTLEnvVars = extractContainerFTLEnvVars cfg ;
2022-10-14 01:34:29 +02:00
in {
ExecStartPre = mkIf cfg . hostConfig . persistVolumes [
" ${ pkgs . coreutils } / b i n / m k d i r - p ${ cfg . hostConfig . volumesPath } / e t c - p i h o l e "
" ${ pkgs . coreutils } / b i n / m k d i r - p ${ cfg . hostConfig . volumesPath } / e t c - d n s m a s q . d "
2022-10-28 18:48:49 +02:00
'' ${ pkgs . podman } / b i n / p o d m a n r m - - i g n o r e " ${ cfg . hostConfig . containerName } " ''
2022-10-14 01:34:29 +02:00
] ;
2022-10-15 21:06:57 +02:00
ExecStart = ''
2022-10-09 19:05:10 +02:00
$ { pkgs . podman } /bin/podman run \
2022-10-14 01:34:29 +02:00
- - rm \
- - rmi \
2022-10-17 01:17:29 +02:00
- - name = " ${ cfg . hostConfig . containerName } " \
2022-10-14 01:34:29 +02:00
$ {
if cfg . hostConfig . persistVolumes then ''
- v $ { cfg . hostConfig . volumesPath } /etc-pihole : /etc/pihole \
- v $ { cfg . hostConfig . volumesPath } /etc-dnsmasq.d : /etc/dnsmasq.d \
'' e l s e " "
} \
2022-12-03 23:07:47 +01:00
$ {
if ! ( isNull cfg . hostConfig . dnsPort ) then ''
- p $ { toString cfg . hostConfig . dnsPort }: 53/tcp \
- p $ { toString cfg . hostConfig . dnsPort }: 53/udp \
'' e l s e " "
} \
$ {
if ! ( isNull cfg . hostConfig . dhcpPort ) then ''
- p $ { toString cfg . hostConfig . dhcpPort }: 67/udp \
'' e l s e " "
} \
$ {
if ! ( isNull cfg . hostConfig . webPort ) then ''
- p $ { toString cfg . hostConfig . webPort }: 80/tcp \
'' e l s e " "
} \
2022-10-14 01:34:29 +02:00
$ {
concatStringsSep " \\ \n "
2022-10-31 01:13:22 +01:00
( map ( envVar : " - e ' ${ envVar . name } = ${ toString envVar . value } ' " ) ( containerEnvVars ++ containerFTLEnvVars ) )
2022-10-14 01:34:29 +02:00
} \
docker-archive:$ { piholeFlake . packages . ${ pkgs . system } . piholeImage }
2022-10-09 19:05:10 +02:00
'' ;
2022-10-28 18:48:49 +02:00
2022-10-14 01:34:29 +02:00
User = " ${ cfg . hostConfig . user } " ;
2022-10-09 19:05:10 +02:00
} ;
2022-10-18 21:04:39 +02:00
postStop = ''
2022-10-28 18:48:49 +02:00
while $ { pkgs . podman } /bin/podman container exists " ${ cfg . hostConfig . containerName } " ; do
2022-10-18 21:04:39 +02:00
$ { pkgs . coreutils-full } /bin/sleep 2 ;
done
'' ;
2022-10-09 19:05:10 +02:00
} ;
2022-10-04 00:19:12 +02:00
} ;
}