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"
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())
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())
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
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