podenv-0.1.0: hub/Applications/fedora.dhall
let Prelude = ../Prelude.dhall
let Podenv = ../Podenv.dhall
let fedora = ../Builders/fedora.dhall
let mkUse =
\(version : Text) ->
\(pre-task : Text) ->
\(packages : List Text) ->
Podenv.Container (fedora.image version pre-task packages)
let default =
\(version : Text) ->
Podenv.Application::{
, runtime = Podenv.Image (fedora.image-ref (":" ++ version))
, volumes = fedora.mkVolumes version
, capabilities = Podenv.Capabilities::{
, terminal = True
, interactive = True
, network = True
, rw = True
, root = True
}
}
let -- | Create a default app and use function
useD =
\(version : Text) -> { default = default version, use = mkUse version "" }
let fusion-repo =
\(variant : Text) ->
\(ver : Text) ->
"https://download1.rpmfusion.org/${variant}/fedora/rpmfusion-${variant}-release-${ver}.noarch.rpm"
let -- | Extra layer to install common graphic packages
extraGraphic =
let extra-pkgs =
[ "mesa-dri-drivers"
, "mesa-vulkan-drivers"
, "libglvnd-glx"
, "glxinfo"
, "gtk4"
, "qt5-qtwayland"
, "xdg-utils"
, "glx-utils"
, "harfbuzz-icu"
]
# [ "dejavu-sans-mono-fonts", "dejavu-sans-mono-fonts" ]
# [ "xdg-dbus-proxy", "xdg-desktop-portal-gtk" ]
# [ "which"
, "findutils"
, "strace"
, "procps-ng"
, "file"
, "xz"
, "diffutils"
]
# [ "pipewire-libs", "pulseaudio-libs", "pipewire-pulseaudio" ]
in ''
RUN dnf install -y ${Prelude.Text.concatSep " " extra-pkgs}
''
let -- | Extra layer to install codec
-- See: https://fedoraproject.org/wiki/Firefox_Hardware_acceleration
extraGraphicCodec =
let -- | A list of packages that are often required but missing from the requirements
gfx-pkgs =
[ "ffmpeg"
, "libva"
, "libva-utils"
, "libva-intel-driver"
, "libvdpau-va-gl"
]
let repo = fusion-repo "free" "\$(rpm -E %fedora)"
in ''
RUN dnf install -y ${repo} && dnf install -y ${Prelude.Text.concatSep
" "
gfx-pkgs}
''
let -- | Simpler helper where app == package == command
simples =
let -- | When the application name is the package and command name
mkUseSimple =
\(extra : Text) ->
\(name : Text) ->
\(desc : Text) ->
Podenv.Application::{
, name
, description = Some desc
, runtime = mkUse "latest" extra [ name ]
, command = [ name ]
}
in { useSimple = mkUseSimple ""
, useGraphicSimple = mkUseSimple extraGraphic
, useGraphicCodecSimple =
mkUseSimple (extraGraphic ++ extraGraphicCodec)
}
let -- | Base image access for extra customization
images =
let mkUseImage =
\(extra : Text) ->
\(version : Text) ->
\(pre-task : Text) ->
fedora.image version (extra ++ pre-task)
in { useImage = mkUseImage ""
, useGraphicImage = mkUseImage extraGraphic
, useGraphicCodecImage =
mkUseImage (extraGraphic ++ extraGraphicCodec)
}
let base =
{ default = default "latest"
, latest =
{ use = mkUse "latest" ""
, useGraphic = mkUse "latest" extraGraphic
, useGraphicCodec = mkUse "latest" (extraGraphic ++ extraGraphicCodec)
}
, `34` = useD "34"
, rawhide = useD "rawhide"
, fusion =
let ver = "34"
let mkVariant =
\(variant : Text) ->
\(extra : Text) ->
{ use =
mkUse
ver
( extra
++ "RUN dnf install -y "
++ fusion-repo variant ver
)
}
in mkVariant "free" ""
// { nonfree =
mkVariant "nonfree" (extraGraphic ++ extraGraphicCodec)
}
, useCopr =
\(name : Text) ->
"RUN dnf -y install dnf-plugins-core && dnf -y copr enable ${name}"
}
in base // simples // images