Browse Source

- création de la commande

fanch 1 year ago
parent
commit
f034578891

+ 1 - 1
.gitignore

@@ -11,4 +11,4 @@
 /.idea/misc.xml
 /.idea/modules.xml
 /work/
-/src/metadocker.egg-info/
+/src/metadocker.egg-info/

+ 1 - 1
setup.py

@@ -26,7 +26,7 @@ def get_files(path):
 
 setup(
     name="metadocker",
-    version="0.2.3",
+    version="0.2.5",
     description="Un outil pour gérer des conteneurs",
     author="François GAUTRAIS",
     author_email="francois@gautrais.eu",

+ 1 - 1
src/metadocker.egg-info/PKG-INFO

@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: metadocker
-Version: 0.2.3
+Version: 0.2.5
 Summary: Un outil pour gérer des conteneurs
 Author: François GAUTRAIS
 Author-email: francois@gautrais.eu

+ 2 - 0
src/metadocker.egg-info/SOURCES.txt

@@ -104,11 +104,13 @@ src/metadocker/docker/__pycache__/driver.cpython-311.pyc
 src/metadocker/docker/__pycache__/driver.cpython-38.pyc
 src/metadocker/env/__init__.py
 src/metadocker/env/base.py
+src/metadocker/env/debian.py
 src/metadocker/env/pythonserver.py
 src/metadocker/env/__pycache__/__init__.cpython-311.pyc
 src/metadocker/env/__pycache__/__init__.cpython-38.pyc
 src/metadocker/env/__pycache__/base.cpython-311.pyc
 src/metadocker/env/__pycache__/base.cpython-38.pyc
+src/metadocker/env/__pycache__/debian.cpython-311.pyc
 src/metadocker/env/__pycache__/pythonserver.cpython-311.pyc
 src/metadocker/env/__pycache__/pythonserver.cpython-38.pyc
 src/metadocker/scripts/__init__.py

+ 4 - 1
src/metadocker/cmdline/commands/specific/shell.py

@@ -7,11 +7,14 @@ class ShellCommand(SpecificCommand):
     NAME = "shell"
     HELP = "Lance un shell sur le contaeneur"
     ARGUMENTS = [
+        Argument("--root", "-r", action="store_true", help="Lance avec utilisateur root"),
         Argument("shell", nargs="?", help="Le shell a executer", default="/bin/bash")
     ]
 
     def run(self, env):
         if not driver.is_running(name=env.docker.name):
             raise SimpleError(f"Le conteneur '{env.docker.name}' n'est pas lancé")
-        driver.exec(env.docker.name, self.shell, interactive=True, catch=False)
+
+
+        driver.exec(env.docker.name, commande=self.shell, uid=0 if self.root else None, interactive=True, catch=False)
 

+ 4 - 1
src/metadocker/docker/driver.py

@@ -62,8 +62,11 @@ class DockerDriver:
         return False
 
 
-    def exec(self, name, commande=None, interactive=False, **kwarsg):
+    def exec(self, name, commande=None, interactive=False, uid=None, **kwarsg):
         args = []
+        if uid is not None:
+            args.extend(("-u", uid))
+
         if interactive:
             args.append("-it")
 

+ 2 - 1
src/metadocker/env/__init__.py

@@ -1 +1,2 @@
-from metadocker.env.pythonserver import PythonServerEnv
+from metadocker.env.pythonserver import PythonServerEnv
+from metadocker.env.debian import DebianEnv

+ 109 - 0
src/metadocker/env/debian.py

@@ -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")
+
+

+ 2 - 1
src/metadocker/env/pythonserver.py

@@ -21,7 +21,8 @@ class PythonServerEnv(Env):
         VarStr("GIT_REPO",  None, help="L'adresse du dépot git", ask=True),
         VarStr("PYTHON_VERSION", "3.11", help="La version de python à utiliser"),
         VarStr("GIT_VERSION", help="La version (branche ou tag) à utiliser. Utiliser None pour rester sur le master", null=True),
-        VarStr("USER", os.environ["USER"], help="Le nom d'utilisateur à utiliser. L'utilisateur sera crée. Utiliser None pour rester en root"),#
+        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"), #
         VarPath("BUILD_DIR", "/build", help="Le dossier au sein du container ou est buildé le projet"),
         VarStr("APT_PACKAGES", help="La liste des packages apt à installer (séparé par des espaces)"),