@@ -11,16 +11,21 @@ import {
1111 LanguageClientOptions ,
1212 StreamInfo ,
1313} from 'vscode-languageclient' ;
14+ import { promisify } from 'util' ;
1415
1516import * as tarfs from 'tar-fs' ;
1617import * as Docker from 'dockerode' ;
1718import * as ip from 'ip' ;
1819
1920const docker = new Docker ( ) ;
21+
22+ const followProgress = promisify ( docker . modem . followProgress ) ;
23+
2024const clientPort : number = 3333 ;
2125const dockerRepo : string = 'ibmcom' ;
2226const dockerImage : string = 'codewind-java-profiler-language-server' ;
2327const dockerTag : string = 'latest' ;
28+ const dockerFullImageName = `${ dockerRepo } /${ dockerImage } :${ dockerTag } ` ;
2429let clientServer : net . Server ;
2530let client : LanguageClient ;
2631let serverConnected = false ;
@@ -63,11 +68,20 @@ export async function activate(context: ExtensionContext) {
6368
6469async function startServerDockerContainer ( dockerBinds : string [ ] ) {
6570 try {
71+ await removeExistingContainer ( ) ;
72+ } catch ( err ) {
73+ // don't care if already removed
74+ }
75+
76+ try {
77+ console . log ( `Trying to pull image ${ dockerFullImageName } ` ) ;
78+
6679 await pullDockerImage ( ) ;
6780 console . log ( 'Pull completed!' ) ;
6881 } catch ( error ) {
6982 console . log ( 'Pull failed, building from local Dockerfile' ) ;
7083 await buildLocalDockerImage ( ) ;
84+ console . log ( error ) ;
7185 }
7286 await startContainer ( dockerBinds ) ;
7387
@@ -104,26 +118,21 @@ function waitForServerConnection() {
104118}
105119
106120async function pullDockerImage ( ) {
107- await removeExistingContainer ( ) ;
108- await docker . pull ( `${ dockerRepo } /${ dockerImage } :${ dockerTag } ` , { } ) ;
121+ const stream = await docker . pull ( dockerFullImageName , { } ) ;
122+ // wait for the pull to complete
123+ await followProgress ( stream ) ;
109124}
110125
111126async function buildLocalDockerImage ( ) {
112- try {
113- await removeExistingContainer ( ) ;
114- } catch ( error ) {
115- // if it doesn't exist then try to build it
116- // TODO: host image and try to pull instead
117- const pack = tarfs . pack ( path . join ( __dirname , '../..' , 'server' ) ) ;
118-
119- const stream = await docker . buildImage ( pack , { t : dockerImage } ) ;
120- // wait for the build to finish
121- await new Promise ( ( resolve , reject ) => {
122- docker . modem . followProgress ( stream , ( err : any , res : { } | PromiseLike < { } > ) => err ? reject ( err ) : resolve ( res ) , ( event ) => {
123- // console.log(event.stream);
124- } ) ;
127+ const pack = tarfs . pack ( path . join ( __dirname , '../..' , 'server' ) ) ;
128+
129+ const stream = await docker . buildImage ( pack , { t : dockerFullImageName } ) ;
130+ // wait for the build to finish
131+ await new Promise ( ( resolve , reject ) => {
132+ docker . modem . followProgress ( stream , ( err : any , res : { } | PromiseLike < { } > ) => err ? reject ( err ) : resolve ( res ) , ( event ) => {
133+ console . log ( event . stream ) ;
125134 } ) ;
126- }
135+ } ) ;
127136}
128137
129138async function removeExistingContainer ( ) {
@@ -139,7 +148,7 @@ async function removeExistingContainer() {
139148
140149async function startContainer ( dockerBinds : string [ ] ) {
141150 const container = await docker . createContainer ( {
142- Image : dockerImage ,
151+ Image : dockerFullImageName ,
143152 name : dockerImage ,
144153 Env : [ `CLIENT_PORT=${ clientPort } ` , `CLIENT_HOST=${ ip . address ( ) } ` , `BINDS="${ dockerBinds } "` ] ,
145154 HostConfig : {
0 commit comments