Exemplo n.º 1
0
def processActions(args):

    if args.version:
        ver = str(require(__package__)[0].version)
        if ver == "LAST-TAG":
            ver = "development version"
        print("{prog} {version}".format(prog=__package__, version=ver))
        return

    if getUserId() == 0:
        raise AliDockError("refusing to execute as root: use an unprivileged user account")

    aliDock = AliDock(args.__dict__)

    try:
        hasUpdates = aliDock.hasClientUpdates()
        if hasUpdates and platform.system() == "Windows":
            # No auto update on Windows at the moment
            LOG.error("You are using an obsolete version of alidock. Use pip to upgrade it.")
        elif hasUpdates and not aliDock.conf["dontUpdateAlidock"]:
            aliDock.doAutoUpdate()
            LOG.error("You are using an obsolete version of alidock.")
            LOG.error("Upgrade NOW with:")
            LOG.error("    bash <(curl -fsSL https://bit.ly/alidock-installer)")
    except AliDockError:
        LOG.warning("Cannot check for alidock updates this time")

    if args.action in ["enter", "exec", "root", "start"]:
        processEnterStart(aliDock, args)
    elif args.action == "status":
        processStatus(aliDock)
    elif args.action == "stop":
        processStop(aliDock)
    else:
        assert False, "invalid action"
Exemplo n.º 2
0
 def __init__(self, overrideConf=None):
     self.cli = docker.from_env()
     self.dirInside = "/home/alidock"
     self.userName = getUserName()
     self.conf = self.getDefaultConf()
     self.parseConfig()
     self.overrideConfig(overrideConf)
     self.conf["dockName"] = "{dockName}-{userId}".format(
         dockName=self.conf["dockName"], userId=getUserId())
Exemplo n.º 3
0
 def __init__(self, overrideConf=None):
     self.cli = docker.from_env()
     self.dirInside = "/home/alidock"
     self.userName = re.sub("[^0-9a-z_-]", "_", os.getlogin().lower())
     self.conf = {
         "dockName"          : "alidock",
         "imageName"         : "alisw/alidock:latest",
         "dirOutside"        : os.path.join("~", "alidock"),
         "updatePeriod"      : 43200,
         "dontUpdateImage"   : False,
         "dontUpdateAlidock" : False,
         "useNvidiaRuntime"  : False,
         "mount"             : [],
         "cvmfs"             : False
     }
     self.parseConfig()
     self.overrideConfig(overrideConf)
     self.conf["dockName"] = "{dockName}-{userId}".format(dockName=self.conf["dockName"],
                                                          userId=getUserId())
Exemplo n.º 4
0
    def run(self):
        # Create directory to be shared with the container
        outDir = os.path.expanduser(self.conf["dirOutside"])
        dockName = self.conf["dockName"].rsplit("-", 1)[0]
        runDir = outDir + "/" + ".alidock-" + dockName
        try:
            os.makedirs(runDir)
        except OSError as exc:
            if not os.path.isdir(runDir) or exc.errno != errno.EEXIST:
                raise AliDockError("cannot create directory {dir} to share with container, "
                                   "check permissions".format(dir=self.conf["dirOutside"]))

        initShPath = os.path.join(runDir, "init.sh")
        initSh = jinja2.Template(
            resource_string("alidock.helpers", "init.sh.j2").decode("utf-8"))
        with open(initShPath, "w", newline="\n") as fil:
            fil.write(initSh.render(sharedDir=self.dirInside,
                                    runDir=self.dirInside + "/.alidock-" + dockName,
                                    dockName=dockName,
                                    userName=self.userName,
                                    userId=getUserId()))
        os.chmod(initShPath, 0o700)

        if platform.system() == "Darwin":
            self.initDarwin()

        dockEnvironment = []
        dockRuntime = None

        # Define which mounts to expose to the container. On non-Linux, we need a native volume too
        dockMounts = [Mount(self.dirInside, outDir, type="bind", consistency="cached")]
        if platform.system() != "Linux":
            dockMounts.append(Mount("/persist", "persist-"+self.conf["dockName"], type="volume"))

        if self.conf["cvmfs"]:
            dockMounts.append(Mount(source="/cvmfs",
                                    target="/cvmfs",
                                    type="bind",
                                    propagation="shared" if platform.system() == "Linux" else None))

        dockMounts += self.getUserMounts()  # user-defined mounts

        if self.conf["useNvidiaRuntime"]:
            if self.hasRuntime("nvidia"):
                dockRuntime = "nvidia"
                dockEnvironment = ["NVIDIA_VISIBLE_DEVICES=all"]
            else:
                raise AliDockError("cannot find the NVIDIA runtime in your Docker installation")

        # Start container with that script
        self.cli.containers.run(self.conf["imageName"],
                                command=[self.dirInside + "/.alidock-" + dockName + "/init.sh"],
                                detach=True,
                                auto_remove=True,
                                cap_add=["SYS_PTRACE"],
                                environment=dockEnvironment,
                                hostname=self.conf["dockName"],
                                name=self.conf["dockName"],
                                mounts=dockMounts,
                                ports={"22/tcp": None}, # None == random port
                                runtime=dockRuntime)

        return True
Exemplo n.º 5
0
    def run(self):
        # Create directory to be shared with the container
        outDir = os.path.expanduser(self.conf["dirOutside"])
        dockName = self.conf["dockName"].rsplit("-", 1)[0]
        runDir = os.path.join(outDir, ".alidock-" + dockName)
        try:
            os.makedirs(runDir)
        except OSError as exc:
            if not os.path.isdir(runDir) or exc.errno != errno.EEXIST:
                raise AliDockError(
                    "cannot create directory {dir} to share with container, "
                    "check permissions".format(dir=self.conf["dirOutside"]))

        dockDevices = []
        # {"groupname": gid} added inside the container (gid=None == I don't care)
        addGroups = {"video": getRocmVideoGid()}
        if self.conf["enableRocmDevices"] and addGroups["video"]:
            dockDevices += ["/dev/kfd", "/dev/dri"]
        elif self.conf["enableRocmDevices"]:
            raise AliDockError(
                "cannot enable ROCm: check your ROCm installation")
        else:
            del addGroups["video"]

        initShPath = os.path.join(runDir, "init.sh")
        initSh = jinja2.Template(
            resource_string("alidock.helpers", "init.sh.j2").decode("utf-8"))
        with open(initShPath, "w", newline="\n") as fil:
            fil.write(
                initSh.render(sharedDir=self.dirInside,
                              runDir=posixpath.join(self.dirInside,
                                                    ".alidock-" + dockName),
                              dockName=dockName,
                              userName=self.userName,
                              userId=getUserId(),
                              useWebX11=self.conf["web"],
                              addGroups=addGroups))

        os.chmod(initShPath, 0o700)

        if platform.system() == "Darwin":
            self.initDarwin()

        dockEnvironment = []
        dockRuntime = None

        # Define which mounts to expose to the container. On non-Linux, we need a native volume too
        dockMounts = [
            Mount(self.dirInside, outDir, type="bind", consistency="cached")
        ]
        if platform.system() != "Linux":
            dockMounts.append(
                Mount("/persist",
                      "persist-" + self.conf["dockName"],
                      type="volume"))

        if self.conf["cvmfs"]:
            dockMounts.append(
                Mount(source="/cvmfs",
                      target="/cvmfs",
                      type="bind",
                      propagation="shared"
                      if platform.system() == "Linux" else None))

        dockMounts += self.getUserMounts()  # user-defined mounts

        if self.conf["useNvidiaRuntime"]:
            if self.hasRuntime("nvidia"):
                dockRuntime = "nvidia"
                dockEnvironment = ["NVIDIA_VISIBLE_DEVICES=all"]
            else:
                raise AliDockError(
                    "cannot find the NVIDIA runtime in your Docker installation"
                )

        # Ports to forward (None == random port)
        fwdPorts = {"22/tcp": ("127.0.0.1", None)}
        if self.conf["web"]:
            fwdPorts["14500/tcp"] = ("127.0.0.1", None)

        # Start container with that script
        self.cli.containers.run(
            self.conf["imageName"],
            command=[self.dirInside + "/.alidock-" + dockName + "/init.sh"],
            detach=True,
            auto_remove=True,
            cap_add=["SYS_PTRACE"],
            environment=dockEnvironment,
            hostname=self.conf["dockName"],
            name=self.conf["dockName"],
            mounts=dockMounts,
            ports=fwdPorts,
            runtime=dockRuntime,
            devices=dockDevices,
            group_add=addGroups.keys(),
            shm_size="1G")

        return True