def contain(command, image_name, image_dir, container_id, container_dir, cpu_shares, memory, memory_swap): _setup_cpu_cgroup(container_id, cpu_shares) _setup_memory_cgroup(container_id, memory, memory_swap) # TODO: similarly to the CPU cgorup, add Memory cgroup support here # setup memory -> memory.limit_in_bytes, # memory_swap -> memory.memsw.limit_in_bytes if they are not None linux.sethostname(container_id) # Change hostname to container_id linux.mount(None, '/', None, linux.MS_PRIVATE | linux.MS_REC, None) new_root = create_container_root(image_name, image_dir, container_id, container_dir) print('Created a new root fs for our container: {}'.format(new_root)) _create_mounts(new_root) old_root = os.path.join(new_root, 'old_root') os.makedirs(old_root) linux.pivot_root(new_root, old_root) os.chdir('/') linux.umount2('/old_root', linux.MNT_DETACH) # umount old root os.rmdir('/old_root') # rmdir the old_root dir os.execvp(command[0], command)
def contain(command, image_name, image_dir, container_id, container_dir, cpu_shares): # TODO: insert the container to a new cpu cgroup named: # 'rubber_docker/container_id' _setup_cpu_cgroup(container_id, cpu_shares) # TODO: if (cpu_shares != 0) => set the 'cpu.shares' in our cpu cgroup linux.sethostname(container_id) # change hostname to container_id linux.mount(None, '/', None, linux.MS_PRIVATE | linux.MS_REC, None) new_root = create_container_root(image_name, image_dir, container_id, container_dir) print('Created a new root fs for our container: {}'.format(new_root)) _create_mounts(new_root) old_root = os.path.join(new_root, 'old_root') os.makedirs(old_root) linux.pivot_root(new_root, old_root) os.chdir('/') linux.umount2('/old_root', linux.MNT_DETACH) # umount old root os.rmdir('/old_root') # rmdir the old_root dir os.execvp(command[0], command)
def contain(command, image_name, image_dir, container_id, container_dir, cpu_shares, memory, memory_swap, user): _setup_cpu_cgroup(container_id, cpu_shares) _setup_memory_cgroup(container_id, memory, memory_swap) linux.sethostname(container_id) # change hostname to container_id linux.mount(None, '/', None, linux.MS_PRIVATE | linux.MS_REC, None) new_root = create_container_root(image_name, image_dir, container_id, container_dir) print('Created a new root fs for our container: {}'.format(new_root)) _create_mounts(new_root) old_root = os.path.join(new_root, 'old_root') os.makedirs(old_root) linux.pivot_root(new_root, old_root) os.chdir('/') linux.umount2('/old_root', linux.MNT_DETACH) # umount old root os.rmdir('/old_root') # rmdir the old_root dir # TODO: if user is set, drop privileges using os.setuid() # (and optionally os.setgid()). os.execvp(command[0], command)
def contain(command, image_name, image_dir, container_id, container_dir, cpu_shares, memory, memory_swap, user): _setup_cpu_cgroup(container_id, cpu_shares) _setup_memory_cgroup(container_id, memory, memory_swap) linux.sethostname(container_id) # change hostname to container_id linux.mount(None, '/', None, linux.MS_PRIVATE | linux.MS_REC, None) new_root = create_container_root( image_name, image_dir, container_id, container_dir) print('Created a new root fs for our container: {}'.format(new_root)) _create_mounts(new_root) old_root = os.path.join(new_root, 'old_root') os.makedirs(old_root) linux.pivot_root(new_root, old_root) os.chdir('/') linux.umount2('/old_root', linux.MNT_DETACH) # umount old root os.rmdir('/old_root') # rmdir the old_root dir # TODO: if user is set, drop privileges using os.setuid() # (and optionally os.setgid()). os.execvp(command[0], command)
def contain(command, image_name, image_dir, container_id, container_dir, cpu_shares): # TODO: insert the container to a new cpu cgroup named: # 'rubber_docker/container_id' # TODO: if (cpu_shares != 0) => set the 'cpu.shares' in our cpu cgroup linux.sethostname(container_id) # change hostname to container_id linux.mount(None, '/', None, linux.MS_PRIVATE | linux.MS_REC, None) new_root = create_container_root( image_name, image_dir, container_id, container_dir) print('Created a new root fs for our container: {}'.format(new_root)) _create_mounts(new_root) old_root = os.path.join(new_root, 'old_root') os.makedirs(old_root) linux.pivot_root(new_root, old_root) os.chdir('/') linux.umount2('/old_root', linux.MNT_DETACH) # umount old root os.rmdir('/old_root') # rmdir the old_root dir os.execvp(command[0], command)
def contain(command, image_name, image_dir, container_id, container_dir, cpu_shares, memory, memory_swap): _setup_cpu_cgroup(container_id, cpu_shares) # TODO: similarly to the CPU cgorup, add Memory cgroup support here # setup memory -> memory.limit_in_bytes, # memory_swap -> memory.memsw.limit_in_bytes if they are not None linux.sethostname(container_id) # Change hostname to container_id linux.mount(None, '/', None, linux.MS_PRIVATE | linux.MS_REC, None) new_root = create_container_root( image_name, image_dir, container_id, container_dir) print('Created a new root fs for our container: {}'.format(new_root)) _create_mounts(new_root) old_root = os.path.join(new_root, 'old_root') os.makedirs(old_root) linux.pivot_root(new_root, old_root) os.chdir('/') linux.umount2('/old_root', linux.MNT_DETACH) # umount old root os.rmdir('/old_root') # rmdir the old_root dir os.execvp(command[0], command)
def contain(command, image_name, image_dir, container_id, container_dir): linux.unshare(linux.CLONE_NEWNS) # create a new mount namespace # TODO: switch to a new UTS namespace, change hostname to container_id # HINT: use linux.sethostname() linux.unshare(linux.CLONE_NEWUTS) linux.sethostname(container_id) linux.mount(None, '/', None, linux.MS_PRIVATE | linux.MS_REC, None) new_root = create_container_root(image_name, image_dir, container_id, container_dir) print('Created a new root fs for our container: {}'.format(new_root)) _create_mounts(new_root) old_root = os.path.join(new_root, 'old_root') os.makedirs(old_root) linux.pivot_root(new_root, old_root) os.chdir('/') linux.umount2('/old_root', linux.MNT_DETACH) # umount old root os.rmdir('/old_root') # rmdir the old_root dir os.execvp(command[0], command)
def contain(command, image_name, image_dir, container_id, container_dir): linux.sethostname(container_id) # change hostname to container_id linux.mount(None, '/', None, linux.MS_PRIVATE | linux.MS_REC, None) new_root = create_container_root(image_name, image_dir, container_id, container_dir) print('Created a new root fs for our container: {}'.format(new_root)) _create_mounts(new_root) old_root = os.path.join(new_root, 'old_root') os.makedirs(old_root) linux.pivot_root(new_root, old_root) os.chdir('/') linux.umount2('/old_root', linux.MNT_DETACH) # umount old root os.execvp(command[0], command)
def contain(command, image_name, image_dir, container_id, container_dir): linux.sethostname(container_id) # change hostname to container_id linux.mount(None, "/", None, linux.MS_PRIVATE | linux.MS_REC, None) new_root = create_container_root(image_name, image_dir, container_id, container_dir) print("Created a new root fs for our container: {}".format(new_root)) _create_mounts(new_root) old_root = os.path.join(new_root, "old_root") os.makedirs(old_root) linux.pivot_root(new_root, old_root) os.chdir("/") linux.umount2("/old_root", linux.MNT_DETACH) # umount old root os.rmdir("/old_root") # rmdir the old_root dir os.execvp(command[0], command)
def contain(cmd, cid): _set_cgroup_cpu(cid) _set_cgroup_memory(cid) linux.unshare(linux.CLONE_NEWNS) # create a new mount namespace linux.unshare(linux.CLONE_NEWUTS) # create a new uts namespace linux.unshare(linux.CLONE_NEWNET) # create a new n/w namespace linux.sethostname(cid) # Use linux.clone in run() before fork and uncomment the above lines linux.mount(None, '/', None, linux.MS_REC | linux.MS_PRIVATE, None) new_root = create_container_root() print("New Root created.") # When using an already extracted image # linux.umount(os.path.join(new_root, 'proc')) # linux.umount(os.path.join(new_root, 'sys')) linux.mount('proc', os.path.join(new_root, 'proc'), 'proc', 0, '') linux.mount('sysfs', os.path.join(new_root, 'sys'), 'sysfs', 0, '') linux.mount('tmpfs', os.path.join(new_root, 'dev'), 'tmpfs', linux.MS_STRICTATIME | linux.MS_NOSUID, 'mode=755') # Add Basic Devices devs = os.path.join(new_root, 'dev', 'pts') if os.path.exists: pass else: os.makedirs(devs) linux.mount('devpts', devs, 'devpts', 0, '') _makedev(os.path.join(new_root, 'dev')) os.chroot(new_root) os.chdir("/") os.execvp(cmd[0], cmd)
def execute(self, init_params: ContainerInitParams): """ 指定されたパラメータでコンテナを起動する :param init_params: :return: """ # ホスト名をコンテナ ID にする linux.sethostname(init_params.container_id) # ホストのマウントテーブルを汚さないように / をプライベートマウントする linux.mount(None, '/', None, linux.MS_PRIVATE | linux.MS_REC, None) # コンテナのディレクトリを初期化し、ルートディレクトリを変更する container_dir = self._create_container_root_dir( init_params.container_id) print(f'Created a new root fs for our container: {container_dir}') self._mount_image_dir(init_params.image, container_dir) self._init_system_dir(container_dir.root_dir) self._change_root_dir(container_dir.root_dir) # コンテナでコマンドを実行する os.execvp(init_params.command[0], init_params.command)