|
@@ -0,0 +1,109 @@
|
|
|
|
+import argparse
|
|
|
|
+import os
|
|
|
|
+import re
|
|
|
|
+from pathlib import Path
|
|
|
|
+
|
|
|
|
+from metadocker.docker import DockerBuilder
|
|
|
|
+from metadocker.env.base import Env
|
|
|
|
+from metadocker.common.var import VarStr, VarInt, VarPath, VarDict
|
|
|
|
+from metadocker.register import register_env
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+@register_env
|
|
|
|
+class DebianEnv(Env):
|
|
|
|
+ _name_ = "Debian"
|
|
|
|
+ _alias_ = []
|
|
|
|
+ _vars_ = [
|
|
|
|
+ *Env._vars_,
|
|
|
|
+
|
|
|
|
+ VarStr("USER", os.environ["USER"], null=True,
|
|
|
|
+ help="Le nom d'utilisateur à utiliser. L'utilisateur sera crée. Utiliser None pour rester en root"),#
|
|
|
|
+ VarInt("UID", os.getuid(), help="L'UID de l'utilisateur, uniquement si USER est défini"), #
|
|
|
|
+ VarStr("APT_PACKAGES", help="La liste des packages apt à installer (séparé par des espaces)"),
|
|
|
|
+ VarStr("RUN_INSTALL_USER", help="Instruction pour installer en tant qu'utilisateur (si USER est défini)"),
|
|
|
|
+ VarStr("RUN_INSTALL_ROOT", help="Instruction pour installer en tant que root"),
|
|
|
|
+ VarStr("RUN_CMD", help="La commande à installer pour lancer l'application. Par défaut: python -m {PROJECT}"),
|
|
|
|
+ ]
|
|
|
|
+
|
|
|
|
+ USER: str
|
|
|
|
+ UID: int
|
|
|
|
+ APT_PACKAGES: str
|
|
|
|
+ RUN_INSTALL: str
|
|
|
|
+ RUN_CMD: str
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ def _get_packages(self):
|
|
|
|
+ data = self.APT_PACKAGES
|
|
|
|
+ packages = []
|
|
|
|
+
|
|
|
|
+ if isinstance(data, ((tuple, list, set))):
|
|
|
|
+ packages.extend(data)
|
|
|
|
+ elif isinstance(data, str):
|
|
|
|
+ packages.extend(re.sub("\s\+", " ", data).split(" "))
|
|
|
|
+ return packages
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ def _get_envs(self):
|
|
|
|
+ envs=[f'APP_DIR="{self.APP_DIR}"']
|
|
|
|
+ if self.ENV:
|
|
|
|
+ for k, v in self.ENV.items():
|
|
|
|
+ envs.append(f'{k}=\"{v}\"')
|
|
|
|
+ # for k, v in self.env.items():
|
|
|
|
+ # envs.append(f'CFG_{k}=\"{v}\"')
|
|
|
|
+ return "\\\n ".join(envs)
|
|
|
|
+
|
|
|
|
+ def generate_docker_file(self):
|
|
|
|
+ self.docker.from_(f"debian:latest")
|
|
|
|
+
|
|
|
|
+ self.docker.env(self._get_envs())
|
|
|
|
+
|
|
|
|
+ if self.COPY:
|
|
|
|
+ for k, v in self.COPY.items():
|
|
|
|
+ self.docker.copy(k, v)
|
|
|
|
+
|
|
|
|
+ if self.PORTS:
|
|
|
|
+ self.docker.expose(*self.PORTS.values())
|
|
|
|
+
|
|
|
|
+ packages = self._get_packages()
|
|
|
|
+ if packages:
|
|
|
|
+ self.docker.run(f'apt update -y && apt install -y', *packages)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if self.USER:
|
|
|
|
+ self.docker.run(f'adduser --disabled-password --gecos "" --home "/home/{self.USER}" '
|
|
|
|
+ f'--shell "/sbin/nologin" --uid "{self.UID}" {self.USER}')
|
|
|
|
+
|
|
|
|
+ self.docker.run("mkdir -p", f"/home/{self.USER}", " ".join(self.VOLUMES.values()))
|
|
|
|
+ self.docker.run(f"chown -R {self.USER}:{self.USER}", f"/home/{self.USER}",
|
|
|
|
+ " ".join(self.VOLUMES.values()), self.APP_DIR)
|
|
|
|
+
|
|
|
|
+ if self.debug:
|
|
|
|
+ self.docker.run(f"echo 'root:root' | chpasswd")
|
|
|
|
+ self.docker.run(f"echo '{self.USER}:root' | chpasswd")
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if self.RUN_INSTALL_ROOT:
|
|
|
|
+ self.docker.run(self.RUN_INSTALL_ROOT)
|
|
|
|
+
|
|
|
|
+ if self.USER:
|
|
|
|
+ self.docker.user(self.USER)
|
|
|
|
+ self.docker.env("USER", self.USER)
|
|
|
|
+ self.docker.env("PATH", f"/home/{self.USER}/.local/bin:$PATH")
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if self.VOLUMES:
|
|
|
|
+ self.docker.volume(" ".join(self.VOLUMES.values()))
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ # install
|
|
|
|
+ if self.RUN_INSTALL_USER:
|
|
|
|
+ self.docker.run(self.RUN_INSTALL_USER)
|
|
|
|
+
|
|
|
|
+ self.docker.workdir(self.APP_DIR)
|
|
|
|
+
|
|
|
|
+ if self.RUN_CMD:
|
|
|
|
+ self.docker.cmd(self.RUN_CMD or "bash")
|
|
|
|
+
|
|
|
|
+
|