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)