def build()

in liminal/build/image_builder.py [0:0]


    def build(self):
        """
        Builds source code into an image.
        """
        logging.info(f'[ ] Building image: {self.tag}')

        temp_dir = self.__temp_dir()

        self.__copy_source_code(temp_dir)
        self._write_additional_files(temp_dir)

        no_cache = ''
        if self.__NO_CACHE in self.config and self.config[self.__NO_CACHE]:
            no_cache = '--no-cache=true'

        docker = 'docker' if shutil.which('docker') is not None else '/usr/local/bin/docker'
        docker_build_command = f'{docker} build {no_cache} ' + f'--tag {self.tag} '

        docker_build_command += f'--progress=plain {self._build_flags()} '

        docker_build_command += f'{temp_dir}'

        if self._use_buildkit():
            docker_build_command = f'DOCKER_BUILDKIT=1 {docker_build_command}'

        logging.info(docker_build_command)
        docker_build_out = []
        try:
            build_start = time.time()
            # Poll process.stdout to show stdout live
            build_process = subprocess.Popen(
                docker_build_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
            )
            logging.info('=' * 80)
            timeout = 960
            while time.time() < build_start + timeout:
                output = build_process.stdout.readline()
                if build_process.poll() is not None:
                    break
                if output:
                    stdout_log_str = output.strip().decode('utf-8')
                    docker_build_out.append(stdout_log_str)
                    logging.info(stdout_log_str)
            logging.info('=' * 80)
            build_process.stdout.close()
            build_process.wait(time.time() - (build_start + timeout))
        except subprocess.CalledProcessError as e:
            for line in str(e.output)[2:-3].split('\\n'):
                logging.info(line)
            raise e

        self.__remove_dir(temp_dir)

        logging.info(f'[X] Building image: {self.tag} (Success).')

        return '\n'.join(docker_build_out)