Stream out docker-build cmd stdout

diff --git a/liminal/build/image_builder.py b/liminal/build/image_builder.py
index 428d749..6ab179c 100644
--- a/liminal/build/image_builder.py
+++ b/liminal/build/image_builder.py
@@ -21,6 +21,7 @@
 import shutil
 import subprocess
 import tempfile
+import time
 
 
 class ImageBuilder:
@@ -68,26 +69,36 @@
             docker_build_command = f'DOCKER_BUILDKIT=1 {docker_build_command}'
 
         logging.info(docker_build_command)
-
-        docker_build_out = ''
+        docker_build_out = []
         try:
-            docker_build_out = subprocess.check_output(
-                docker_build_command, shell=True, stderr=subprocess.STDOUT, timeout=960
+            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:
-            docker_build_out = e.output
-            raise e
-        finally:
-            logging.info('=' * 80)
-            for line in str(docker_build_out)[2:-3].split('\\n'):
+            for line in str(e.output)[2:-3].split('\\n'):
                 logging.info(line)
-            logging.info('=' * 80)
+            raise e
 
         self.__remove_dir(temp_dir)
 
         logging.info(f'[X] Building image: {self.tag} (Success).')
 
-        return docker_build_out
+        return '\n'.join(docker_build_out)
 
     def __copy_source_code(self, temp_dir):
         self.__copy_dir(os.path.join(self.base_path, self.relative_source_path), temp_dir)