Source code for runway.cfngin.hooks.awslambda.python_requirements._docker
"""Docker logic for python."""from__future__importannotationsimportloggingimportrefromtypingimportTYPE_CHECKINGfromdocker.types.servicesimportMountfrom.....compatimportcached_property,shlex_joinfrom.....utilsimportVersionfrom..dockerimportDockerDependencyInstallerifTYPE_CHECKING:fromdocker.clientimportDockerClientfrom.....contextimportCfnginContext,RunwayContextfrom.importPythonProject
[docs]classPythonDockerDependencyInstaller(DockerDependencyInstaller):"""Docker dependency installer for Python."""project:PythonProject
@cached_propertydefbind_mounts(self)->list[Mount]:"""Bind mounts that will be used by the container."""mounts=[*super().bind_mounts]ifself.project.requirements_txt:mounts.append(Mount(target=f"/var/task/{self.project.requirements_txt.name}",source=str(self.project.requirements_txt),type="bind",))returnmounts@cached_propertydefenvironment_variables(self)->dict[str,str]:"""Environment variables to pass to the docker container. This is a subset of the environment variables stored in the context object as some will cause issues if they are passed. """docker_env_vars=super().environment_variablespip_env_vars={k:vfork,vinself.ctx.env.vars.items()ifk.startswith("PIP")}return{**docker_env_vars,**pip_env_vars}@cached_propertydefinstall_commands(self)->list[str]:"""Commands to run to install dependencies."""ifself.project.requirements_txt:return[shlex_join(self.project.pip.generate_install_command(cache_dir=self.CACHE_DIRifself.project.cache_direlseNone,no_cache_dir=notself.project.args.use_cache,no_deps=bool(self.project.poetryorself.project.pipenv),requirements=f"/var/task/{self.project.requirements_txt.name}",target=self.DEPENDENCY_DIR,)+(self.project.args.extend_pip_argsor[]))]return[]@cached_propertydefpython_version(self)->Version|None:"""Version of Python installed in the docker container."""match=re.search(r"Python (?P<version>\S*)","\n".join(self.run_command("python --version",level=logging.DEBUG)),)ifnotmatch:returnNonereturnVersion(match.group("version"))@cached_propertydefruntime(self)->str|None:"""AWS Lambda runtime determined from the docker container's Python version."""ifnotself.python_version:returnNonereturnf"python{self.python_version.major}.{self.python_version.minor}"