def do_run(self): if DOCKER_CLIENT.is_container_running(self.container.name): raise ContainerExists( 'LocalStack container named "%s" is already running' % self.container.name) return self.container.run()
def cmd_logs(follow: bool): from localstack import config from localstack.utils.bootstrap import LocalstackContainer from localstack.utils.common import FileListener from localstack.utils.docker_utils import DOCKER_CLIENT container_name = config.MAIN_CONTAINER_NAME logfile = LocalstackContainer(container_name).logfile if not DOCKER_CLIENT.is_container_running(container_name): console.print("localstack container not running") sys.exit(1) if not os.path.exists(logfile): console.print("localstack container logfile not found at %s" % logfile) sys.exit(1) if follow: listener = FileListener(logfile, print) listener.start() try: listener.join() except KeyboardInterrupt: pass finally: listener.close() else: with open(logfile) as fd: for line in fd: print(line.rstrip("\n\r"))
def cmd_ssh(): from localstack import config from localstack.utils.docker_utils import DOCKER_CLIENT from localstack.utils.run import run if not DOCKER_CLIENT.is_container_running(config.MAIN_CONTAINER_NAME): raise click.ClickException( 'Expected a running container named "%s", but found none' % config.MAIN_CONTAINER_NAME) try: process = run("docker exec -it %s bash" % config.MAIN_CONTAINER_NAME, tty=True) process.wait() except KeyboardInterrupt: pass
def cmd_logs(follow: bool): from localstack import config from localstack.utils.docker_utils import DOCKER_CLIENT container_name = config.MAIN_CONTAINER_NAME if not DOCKER_CLIENT.is_container_running(container_name): console.print("localstack container not running") sys.exit(1) if follow: for line in DOCKER_CLIENT.stream_container_logs(container_name): print(line.decode("utf-8").rstrip("\r\n")) else: print(DOCKER_CLIENT.get_container_logs(container_name))
def prepare_docker_start(): # prepare environment for docker start container_name = config.MAIN_CONTAINER_NAME if DOCKER_CLIENT.is_container_running(container_name): raise ContainerExists('LocalStack container named "%s" is already running' % container_name) if config.TMP_FOLDER != config.HOST_TMP_FOLDER and not config.LAMBDA_REMOTE_DOCKER: print( f"WARNING: The detected temp folder for localstack ({config.TMP_FOLDER}) is not equal to the " f"HOST_TMP_FOLDER environment variable set ({config.HOST_TMP_FOLDER})." ) # Logger is not initialized at this point, so the warning is displayed via print os.environ[ENV_SCRIPT_STARTING_DOCKER] = "1" # make sure temp folder exists mkdir(config.TMP_FOLDER) try: chmod_r(config.TMP_FOLDER, 0o777) except Exception: pass
def is_container_running(): return DOCKER_CLIENT.is_container_running(container_name)
def is_container_running(self) -> bool: return DOCKER_CLIENT.is_container_running(self.container.name)
def start_infra_in_docker(): container_name = config.MAIN_CONTAINER_NAME if DOCKER_CLIENT.is_container_running(container_name): raise Exception('LocalStack container named "%s" is already running' % container_name) if config.TMP_FOLDER != config.HOST_TMP_FOLDER and not config.LAMBDA_REMOTE_DOCKER: print( f"WARNING: The detected temp folder for localstack ({config.TMP_FOLDER}) is not equal to the " f"HOST_TMP_FOLDER environment variable set ({config.HOST_TMP_FOLDER})." ) # Logger is not initialized at this point, so the warning is displayed via print os.environ[ENV_SCRIPT_STARTING_DOCKER] = "1" # load plugins before starting the docker container plugin_configs = load_plugins() # prepare APIs canonicalize_api_names() entrypoint = os.environ.get("ENTRYPOINT", "") cmd = os.environ.get("CMD", "") user_flags = config.DOCKER_FLAGS image_name = get_docker_image_to_start() service_ports = config.SERVICE_PORTS force_noninteractive = os.environ.get("FORCE_NONINTERACTIVE", "") # get run params plugin_run_params = " ".join( [entry.get("docker", {}).get("run_flags", "") for entry in plugin_configs] ) # container for port mappings port_mappings = PortMappings(bind_host=config.EDGE_BIND_HOST) # get port ranges defined via DOCKER_FLAGS (if any) user_flags = extract_port_flags(user_flags, port_mappings) plugin_run_params = extract_port_flags(plugin_run_params, port_mappings) # construct default port mappings if service_ports.get("edge") == 0: service_ports.pop("edge") for port in service_ports.values(): port_mappings.add(port) env_vars = {} for env_var in config.CONFIG_ENV_VARS: value = os.environ.get(env_var, None) if value is not None: env_vars[env_var] = value bind_mounts = [] data_dir = os.environ.get("DATA_DIR", None) if data_dir is not None: container_data_dir = "/tmp/localstack_data" bind_mounts.append((data_dir, container_data_dir)) env_vars["DATA_DIR"] = container_data_dir bind_mounts.append((config.TMP_FOLDER, "/tmp/localstack")) bind_mounts.append((config.DOCKER_SOCK, config.DOCKER_SOCK)) env_vars["DOCKER_HOST"] = f"unix://{config.DOCKER_SOCK}" env_vars["HOST_TMP_FOLDER"] = config.HOST_TMP_FOLDER if config.DEVELOP: port_mappings.add(config.DEVELOP_PORT) docker_cmd = [config.DOCKER_CMD, "run"] if not force_noninteractive and not in_ci(): docker_cmd.append("-it") if entrypoint: docker_cmd += shlex.split(entrypoint) if env_vars: docker_cmd += [item for k, v in env_vars.items() for item in ["-e", "{}={}".format(k, v)]] if user_flags: docker_cmd += shlex.split(user_flags) if plugin_run_params: docker_cmd += shlex.split(plugin_run_params) docker_cmd += ["--rm", "--privileged"] docker_cmd += ["--name", container_name] docker_cmd += port_mappings.to_list() docker_cmd += [ volume for host_path, docker_path in bind_mounts for volume in ["-v", f"{host_path}:{docker_path}"] ] docker_cmd.append(image_name) docker_cmd += shlex.split(cmd) mkdir(config.TMP_FOLDER) try: run(["chmod", "-R", "777", config.TMP_FOLDER], print_error=False, shell=False) except Exception: pass class ShellRunnerThread(threading.Thread): def __init__(self, cmd): threading.Thread.__init__(self) self.daemon = True self.cmd = cmd def run(self): self.process = run(self.cmd, asynchronous=True, shell=False) # keep this print output here for debugging purposes print(docker_cmd) t = ShellRunnerThread(docker_cmd) t.start() time.sleep(2) if DO_CHMOD_DOCKER_SOCK: # fix permissions on /var/run/docker.sock for i in range(0, 100): if DOCKER_CLIENT.is_container_running(container_name): break time.sleep(2) DOCKER_CLIENT.exec_in_container( container_name, command=["chmod", "777", "/var/run/docker.sock"], user="******" ) t.process.wait() sys.exit(t.process.returncode)