// ĠCopyright Ġ 2 0 2 1 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ // ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ċ package Ġsoftware . aws . tool k its . jetbrains . core . docker Ċ Ċ import Ġcom . intellij . docker . Docker Deployment Configuration Ċ import Ġcom . intellij . docker . Docker Server Runtime Instance Ċ import Ġcom . intellij . docker . agent . Docker Agent Progress Callback Ċ import Ġcom . intellij . docker . agent . Docker Agent Source Type Ċ import Ġcom . intellij . docker . agent . progress . Docker Response Item Ċ import Ġcom . intellij . docker . registry . Docker Agent Repository Config Impl Ċ import Ġcom . intellij . docker . registry . Docker Repository Model Ċ import Ġcom . intellij . docker . remote . run . runtime . Docker Agent Deployment Config Impl Ċ import Ġcom . intellij . docker . runtime s . Docker Application Runtime Ċ import Ġcom . intellij . execution . exec utors . Default Run Executor Ċ import Ġcom . intellij . execution . runners . Execution Environment Builder Ċ import Ġcom . intellij . openapi . application . run In Ed t Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . progress . Task Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . remote Server . configuration . Remote Servers Manager Ċ import Ġcom . intellij . remote Server . configuration . deployment . Deployment Configuration Ċ import Ġcom . intellij . remote Server . impl . runtime . deployment . Deployment Task Impl Ċ import Ġcom . intellij . remote Server . runtime . Deployment Ċ import Ġcom . intellij . remote Server . runtime . deployment . Deployment Status Ċ import Ġcom . intellij . remote Server . runtime . deployment . Deployment Task Ċ import Ġcom . intellij . remote Server . runtime . ui . Remote Servers View Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . future . await Ċ import Ġorg . apache . commons . io . FileUtils Ċ import Ġorg . jetbrains . annotations . Test Only Ċ import Ġorg . jetbrains . concurrency . Async Promise Ċ import Ġorg . jetbrains . concurrency . await Ċ import Ġsoftware . aws . tool k its . core . utils . debug Ċ import Ġsoftware . aws . tool k its . core . utils . getLogger Ċ import Ġsoftware . aws . tool k its . jetbrains . services . ec r . Dockerfile E cr Push Request Ċ import Ġsoftware . aws . tool k its . jetbrains . services . ec r . E cr Utils Ċ import Ġsoftware . aws . tool k its . jetbrains . utils . notify Error Ċ import Ġsoftware . aws . tool k its . jetbrains . utils . notify Info Ċ import Ġsoftware . aws . tool k its . resources . message Ċ import Ġjava . io . File Ċ import Ġjava . io . Object InputStream Ċ import Ġjava . time . Instant Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ Ċ abstract Ġclass ĠAbstract Toolkit Docker Adapter ( protected Ġval Ġproject : ĠProject , Ġprotected Ġval Ġserver Runtime : ĠDocker Server Runtime Instance ) Ġ{ ĊĠĠĠ Ġinternal Ġvar Ġagent Ġ= Ġserver Runtime . agent ĊĠĠĠĠĠĠĠ Ġ@ Test Only ĊĠĠĠĠĠĠĠ Ġset ĊĊĠĠĠ Ġ@ Test Only ĊĠĠĠ Ġabstract Ġfun Ġbuild Local Image ( dockerfile : ĠFile ): ĠString ? ĊĊĠĠĠ Ġopen Ġsuspend Ġfun Ġhack y Build Dockerfile With Ui ( project : ĠProject , Ġpush Request : ĠDockerfile E cr Push Request ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( run Configuration , Ġ_, Ġ_) Ġ= Ġpush Request ĊĠĠĠĠĠĠĠ Ġ// Ġuse Ġconnection Ġspecified Ġin Ġrun Ġconfiguration ĊĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠRemote Servers Manager . getInstance (). find ByName ( run Configuration . server Name , Ġrun Configuration . server Type ) ĊĠĠĠĠĠĠĠ Ġval Ġ( server Connection , Ġdocker Runtime ) Ġ= ĠE cr Utils . get Docker Server Runtime Instance ( server ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġprep Ġthe Ġ" deployment " Ġthat Ġwill Ġbuild Ġthe ĠDockerfile ĊĠĠĠĠĠĠĠ Ġval Ġexec En viron Ġ= ĠExecution Environment Builder . create ( Default Run Executor . get Run Executor Instance (), Ġrun Configuration ). build () ĊĠĠĠĠĠĠĠ Ġval Ġdocker Config Ġ= Ġ( run Configuration . deployment Configuration Ġas ĠDocker Deployment Configuration ) ĊĠĠĠĠĠĠĠ Ġval Ġwas Build Only Ġ= Ġdocker Config . is Build Only ĊĠĠĠĠĠĠĠ Ġdocker Config . is Build Only Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ// Ġup cast ing Ġhere Ġto Ġavoid Ġtype Ġmismatch / unchecked Ġcast Ġwarning Ġon Ġ' deploy ' Ġinvocation ĊĠĠĠĠĠĠĠ Ġval Ġtask : ĠDeployment Task < Deployment Configuration > Ġ= ĠDeployment Task Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Configuration . deployment Source , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Configuration . deployment Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexec En viron ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġwe Ġdon 't Ġhave Ġsomething Ġrunning ĊĠĠĠĠĠĠĠ Ġval Ġexpected Deployment Name Ġ= Ġdocker Runtime . get Deployment Name ( run Configuration . deployment Source , Ġrun Configuration . deployment Configuration ) ĊĠĠĠĠĠĠĠ Ġif Ġ( server Connection . deployments . first OrNull Ġ{ Ġit . name Ġ== Ġexpected Deployment Name Ġ&& Ġit . status Ġ== ĠDeployment Status . DEPLOY ING Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Error ( message (" ec r . push . title "), Ġmessage (" ec r . push . in _ progress ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġunfortunately Ġno Ġcallbacks Ġavailable Ġto Ġgrab Ġthe ĠDeployment Ġinstance ĊĠĠĠĠĠĠĠ Ġval Ġdeployment Promise Ġ= ĠAsync Promise < Deployment >() ĊĠĠĠĠĠĠĠ Ġserver Connection . deploy ( task ) Ġ{ Ġdeployment Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug Ġ{ Ġ" Retrie ving ĠDeployment Ġassociated Ġwith Ġ'$ deployment Name '" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Servers View . getInstance ( project ). show Deployment ( server Connection , Ġdeployment Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun In Ed t Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeployment Promise . set Result ( server Connection . deployments . first Ġ{ Ġit . name Ġ== Ġdeployment Name Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġseems Ġg ross Ġbut Ġthis Ġis Ġcleaner Ġthan Ġmanually Ġattempting Ġto Ġexpose Ġthe Ġbuild Ġlogs Ġto Ġthe Ġuser ĊĠĠĠĠĠĠĠ Ġval Ġdeployment Ġ= Ġdeployment Promise . await () ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġwhy Ġdoesn 't Ġlogging Ġto Ġthis Ġlog Ġhandler Ġdo Ġanything ? ĊĠĠĠĠĠĠĠ Ġval Ġlog Handler Ġ= Ġdeployment . get OrCreate Log Manager ( project ). main Logging Handler ĊĊĠĠĠĠĠĠĠ Ġ// Ġunfortunately Ġno Ġcallbacks Ġavailable Ġto Ġgrab Ġfailure ĊĠĠĠĠĠĠĠ Ġwhile Ġ( deployment . status Ġ== ĠDeployment Status . DEPLOY ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( deployment . status Ġ!= ĠDeployment Status . DEPLOY ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Error ( message (" ec r . push . title "), Ġmessage (" ec r . push . failed ", Ġdeployment . status Text )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġruntime Ġ= Ġdeployment . runtime Ġas ? ĠDocker Application Runtime ĊĠĠĠĠĠĠĠ Ġif Ġ( runtime Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Error ( message (" ec r . push . title "), Ġmessage (" ec r . push . failed ", Ġdeployment . status Text )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! was Build Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug Ġ{ Ġ" Configuration Ġspecified Ġadditional Ġ' run ' Ġparameters Ġin ĠDockerfile Ġthat Ġwill Ġbe Ġignored " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Handler . print (" Skipping Ġ' Run ' Ġportion Ġof ĠDockerfile Ġbuild Ġconfiguration \ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ" sha 2 5 6 :${ runtime . image Id }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġsuspend Ġfun Ġpush Image ( local Tag : ĠString , Ġconfig : ĠDocker Repository Model ) ĊĊĠĠĠ Ġfun Ġget Local Images (): ĠList < Local Image > Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠFIX _ WHEN _ MIN _ IS _ 2 1 2 : Ġpotentially Ġnull Ġpre - 2 1 2 ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN NE C ESS ARY _ SAFE _ CALL ") ĊĠĠĠĠĠĠĠ Ġagent . get Images ( null )?. flatMap Ġ{ Ġimage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage . image Repo Tags ?. map Ġ{ Ġlocal Tag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġlocal Tag . take Unless Ġ{ Ġit Ġ== ĠNO _ TAG _ TAG Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Image ( image . image Id , Ġtag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠlistOf ( Local Image ( image . image Id , Ġnull )) ĊĠĠĠĠĠĠĠ Ġ} ?. toList () Ġ?: Ġempty List () ĊĊĠĠĠ Ġfun Ġpull Image ( ĊĠĠĠĠĠĠĠ Ġconfig : ĠDocker Repository Model , ĊĠĠĠĠĠĠĠ Ġprogress Indicator : ĠProgress Indicator ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ= Ġserver Runtime . agent . pull Image ( ĊĠĠĠĠĠĠĠ ĠDocker Agent Repository Config Impl ( config ), ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠDocker Agent Progress Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbased Ġon ĠRegistry Runtime Task 's Ġimpl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstep ( status : ĠString , Ġcurrent : ĠLong , Ġtotal : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug Ġ{ Ġ" step : Ġstatus : Ġ$ status , Ġcurrent : Ġ$ current , Ġtotal : Ġ$ total " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Indicator ?. let Ġ{ Ġindicator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin determinate Ġ= Ġtotal Ġ== Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . text 2 Ġ= Ġ"$ status Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( in determinate ) Ġ"" Ġelse Ġ"${ FileUtils . byte Count To Display Size ( current )} Ġof Ġ${ FileUtils . byte Count To Display Size ( total )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . isIn determinate Ġ= Ġin determinate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! in determinate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . fraction Ġ= Ġcurrent . toDouble () Ġ/ Ġtotal . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsucceeded ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug Ġ{ Ġ" Pull Ġfrom ĠE CR Ġsucceeded : Ġ$ message " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Ġ= Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġsoftware . aws . tool k its . resources . message (" ec r . pull . title "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfailed ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug Ġ{ Ġ" Pull Ġfrom ĠE CR Ġfailed : Ġ$ message " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Ġ= Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġsoftware . aws . tool k its . resources . message (" ec r . pull . title "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// Ġcom . intellij . docker . agent . progress . Docker Image Builder Ġis Ġprobably Ġthe Ġcorrect Ġinterface Ġto Ġuse Ġbut Ġneed Ġto Ġfigure Ġout Ġhow Ġto Ġget Ġan Ġinstance Ġof Ġit ĊĠĠĠ Ġprotected Ġsuspend Ġfun Ġhack y Build Dockerfile Under Indicator ( project : ĠProject , Ġpush Request : ĠDockerfile E cr Push Request ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocker Config Ġ= Ġ( push Request . docker Build Configuration . deployment Configuration Ġas ĠDocker Deployment Configuration ) ĊĠĠĠĠĠĠĠ Ġval Ġtag Ġ= Ġdocker Config . separate Image Tags . first OrNull () Ġ?: ĠInstant . now (). to Epoch Milli (). toString () ĊĠĠĠĠĠĠĠ Ġ// Ġshould Ġnever Ġbe Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġdocker filePath Ġ= Ġdocker Config . source FilePath Ġ?: Ġthrow ĠRuntimeException (" Docker Ġrun Ġconfiguration Ġstarted Ġwith Ġinvalid Ġsource Ġfile ") ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġobject Ġ: ĠDocker Agent Deployment Config Impl ( tag , Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetFile () Ġ= ĠFile ( docker filePath ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsource Type () Ġ= ĠDocker Agent Source Type . FILE . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Custom Context Folder () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Config . context FolderPath ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġsuper . get Custom Context Folder () ĊĠĠĠĠĠĠĠ Ġ}. with En vs ( docker Config . env Vars . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Build Args ( docker Config . build Args . to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= Ġserver Runtime . agent . create Image Builder (). async Build Image ( config ). await () ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠCompletableFuture < String ?> () ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠTask . Background able ( project , Ġmessage (" dockerfile . building ", Ġdocker filePath ), Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( indicator : ĠProgress Indicator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . isIn determinate Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġqueue . take () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeserialized Ġ= ĠObject InputStream ( obj . inputStream ()). read Object () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ( de serialized Ġas ? ĠDocker Response Item )?. stream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ!= Ġnull Ġ&& Ġmessage . trim (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . text 2 Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug Ġ{ Ġmessage Ġ?: Ġdeserialized . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture . complete ( server Runtime . agent . get Images ( null ). first OrNull Ġ{ Ġit . image Repo Tags . contains ("$ tag : latest ") Ġ} ?. image Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. queue () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfuture . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNO _ TAG _ TAG Ġ= Ġ"< none >:< none >" ĊĊĠĠĠĠĠĠĠ Ġval ĠLOG Ġ= Ġget Logger < Abstract Toolkit Docker Adapter >() ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠLocal Image ( ĊĠĠĠ Ġval Ġimage Id : ĠString , ĊĠĠĠ Ġval Ġtag : ĠString ? Ċ ) Ċ