about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/azure/ai/ml/_local_endpoints/dockerfile_resolver.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/azure/ai/ml/_local_endpoints/dockerfile_resolver.py')
-rw-r--r--.venv/lib/python3.12/site-packages/azure/ai/ml/_local_endpoints/dockerfile_resolver.py156
1 files changed, 156 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/azure/ai/ml/_local_endpoints/dockerfile_resolver.py b/.venv/lib/python3.12/site-packages/azure/ai/ml/_local_endpoints/dockerfile_resolver.py
new file mode 100644
index 00000000..3f126e2d
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/azure/ai/ml/_local_endpoints/dockerfile_resolver.py
@@ -0,0 +1,156 @@
+# ---------------------------------------------------------
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# ---------------------------------------------------------
+
+
+import logging
+from pathlib import Path
+from typing import List, Optional
+
+from azure.ai.ml.constants._common import DefaultOpenEncoding
+from azure.ai.ml.constants._endpoint import LocalEndpointConstants
+
+from .dockerfile_instructions import Cmd, Copy, From, Run, Workdir
+
+module_logger = logging.getLogger(__name__)
+
+
+class DockerfileResolver(object):
+    """Represents the contents of a Dockerfile and handles writing the Dockerfile to User's system.
+
+    :param docker_base_image: name of local endpoint
+    :type docker_base_image: str
+    :param docker_conda_file_name: name of conda file to copy into docker image
+    :type docker_conda_file_name: str
+    :param docker_port: port to expose in docker image
+    :type docker_port: str
+    :param docker_azureml_app_path: path in docker image to user's azureml app
+    :type docker_azureml_app_path: (str, optional)
+    """
+
+    def __init__(
+        self,
+        docker_base_image: str,
+        dockerfile: str,
+        docker_conda_file_name: Optional[str] = None,
+        docker_port: Optional[str] = None,
+        docker_azureml_app_path: Optional[str] = None,
+        install_debugpy: bool = False,
+    ):
+        """Constructor of a Dockerfile object.
+
+        :param docker_base_image: base image
+        :type docker_base_image: str
+        :param dockerfile: contents of dockerfile
+        :type dockerfile: str
+        :param docker_conda_file_name: name of local endpoint
+        :type docker_conda_file_name: str
+        :param docker_port: port to expose in docker image
+        :type docker_port: str
+        :param docker_azureml_app_path: name of local deployment
+        :type docker_azureml_app_path: (str, optional)
+        :return DockerfileResolver:
+        """
+        self._instructions: List[object] = []
+        self._local_dockerfile_path: Optional[str] = None
+        self._dockerfile = dockerfile
+        self._docker_base_image = docker_base_image
+        self._docker_conda_file_name = docker_conda_file_name
+        self._docker_azureml_app_path = docker_azureml_app_path
+        self._docker_port = docker_port
+        self._construct(install_debugpy=install_debugpy)
+
+    @property
+    def local_path(self) -> Optional[str]:
+        """Returns the local dockerfile path.
+
+        :return: str
+        """
+        return self._local_dockerfile_path
+
+    def __str__(self) -> str:
+        """Override DockerfileResolver str() built-in func to return the Dockerfile contents as a string.
+
+        :return: Dockerfile Contents
+        :rtype: str
+        """
+        return "" if len(self._instructions) == 0 else "\n".join([str(instr) for instr in self._instructions])
+
+    def _construct(self, install_debugpy: bool = False) -> None:
+        """Internal use only.
+
+        Constructs the Dockerfile instructions based on properties.
+
+        :param install_debugpy: Whether to install debugpy. Defaults to False.
+        :type install_debugpy: bool
+        """
+        self._instructions = []
+        if self._docker_base_image:
+            self._instructions = [From(self._docker_base_image)]
+        else:
+            self._instructions = [self._dockerfile]
+        if self._docker_port:
+            self._instructions.extend(
+                [
+                    Run(f"mkdir -p {self._docker_azureml_app_path}"),
+                    Workdir(str(self._docker_azureml_app_path)),
+                ]
+            )
+
+        if self._docker_conda_file_name and self._docker_azureml_app_path:
+            self._instructions.extend(
+                [
+                    Copy(
+                        [
+                            f"{self._docker_conda_file_name}",
+                        ],
+                        self._docker_azureml_app_path,
+                    ),
+                    Run(
+                        (
+                            f"conda env create -n {LocalEndpointConstants.CONDA_ENV_NAME} "
+                            f"--file {self._docker_conda_file_name}"
+                        )
+                    ),
+                ]
+            )
+            if install_debugpy:
+                self._instructions.extend(
+                    [Run(f"conda run -n {LocalEndpointConstants.CONDA_ENV_NAME} pip install debugpy")]
+                )
+            self._instructions.extend(
+                [
+                    Cmd(
+                        [
+                            "conda",
+                            "run",
+                            "--no-capture-output",
+                            "-n",
+                            LocalEndpointConstants.CONDA_ENV_NAME,
+                            "runsvdir",
+                            "/var/runit",
+                        ]
+                    ),
+                ]
+            )
+        else:
+            if install_debugpy:
+                self._instructions.extend([Run("pip install debugpy")])
+            self._instructions.extend(
+                [
+                    Cmd(["runsvdir", "/var/runit"]),
+                ]
+            )
+
+    def write_file(self, directory_path: str, file_prefix: Optional[str] = None) -> None:
+        """Writes this Dockerfile to a file in provided directory and file name prefix.
+
+        :param directory_path: absolute path of local directory to write Dockerfile.
+        :type directory_path: str
+        :param file_prefix: name of Dockerfile prefix
+        :type file_prefix: str
+        """
+        file_name = f"{file_prefix}.Dockerfile" if file_prefix else "Dockerfile"
+        self._local_dockerfile_path = str(Path(directory_path, file_name).resolve())
+        with open(self._local_dockerfile_path, "w", encoding=DefaultOpenEncoding.WRITE) as f:
+            f.write(f"{str(self)}\n")