Source code for boss.container

"""Includes utilities to handle BOSS starting in a container."""

from pathlib import Path
import json
import os
import sys
import subprocess


[docs] def is_in_container(): """Checks if the current process is running inside a docker or podman container.""" cgroup = Path("/proc/self/cgroup") return ( Path("/.dockerenv").is_file() # docker or (cgroup.is_file() and "docker" in cgroup.read_text()) # docker or Path("/run/.containerenv").is_file() # podman or Path("/var/run/.containerenv").is_file() # podman (FreeBSD) )
[docs] def prepare_container(): """Installs extra packages to the docker container.""" require_restart = False pkg_file = Path("/var/lib/boss/installed_pkgs.json") local_pkgs_path = Path("/etc/boss/") if pkg_file.is_file(): with pkg_file.open("rb") as f: installed_pkgs = json.load(f) else: installed_pkgs = {"pip": [], "local": {}, "apt": []} if (apt_pkgs := os.environ.get("BOSS_APT_PKGS")) is not None: missing_pkgs = [] for pkg in apt_pkgs.replace(" ", ",").split(","): if pkg not in installed_pkgs["apt"]: installed_pkgs["apt"].append(pkg) missing_pkgs.append(pkg) require_restart = True if missing_pkgs: subprocess.check_call(["apt-get", "update"]) subprocess.check_call(["apt-get", "install", "-y"] + missing_pkgs) if (pip_pkgs := os.environ.get("BOSS_PIP_PKGS")) is not None: for pkg in pip_pkgs.replace(" ", ",").split(","): if pkg not in installed_pkgs["pip"]: subprocess.check_call([sys.executable, "-m", "pip", "install", pkg]) installed_pkgs["pip"].append(pkg) require_restart = True if local_pkgs_path.is_dir(): for script in local_pkgs_path.rglob("*.boss.sh"): if script.stem not in installed_pkgs["local"]: subprocess.check_call(["/bin/bash", str(script)]) installed_pkgs["local"][script.stem] = str(script) require_restart = True if require_restart: pkg_file.parent.mkdir(parents=True, exist_ok=True) with pkg_file.open("w") as f: json.dump(installed_pkgs, f) return require_restart