@@ -397,6 +397,20 @@ export function notNull(el: any): boolean {
397
397
return el !== null ;
398
398
}
399
399
400
+ /** Determine the compose command to use (`docker-compose` or `docker compose`). */
401
+ async function composeCommand ( cwd ?: string ) : Promise < string > {
402
+ return new Promise < string > ( ( resolve ) => {
403
+ let cmd = "docker compose" ;
404
+ exec ( `${ cmd } version` , { cwd } , ( error ) => {
405
+ if ( error ) {
406
+ // 'docker compose' is not present, so default to 'docker-compose'
407
+ cmd = "docker-compose" ;
408
+ }
409
+ resolve ( cmd ) ;
410
+ } ) ;
411
+ } ) ;
412
+ }
413
+
400
414
export async function portFromDockerCompose ( ) : Promise < { port : number ; docker : boolean ; service ?: string } > {
401
415
// When running remotely, behave as if there is no docker-compose object within objectscript.conn
402
416
if ( extensionContext . extension . extensionKind === vscode . ExtensionKind . Workspace ) {
@@ -432,8 +446,7 @@ export async function portFromDockerCompose(): Promise<{ port: number; docker: b
432
446
}
433
447
434
448
const envFileParam = envFile ? `--env-file ${ envFile } ` : "" ;
435
- const exe = process . platform === "win32" ? "docker-compose.exe" : "docker-compose" ;
436
- const cmd = `${ exe } -f ${ file } ${ envFileParam } ` ;
449
+ const cmd = `${ await composeCommand ( cwd ) } -f ${ file } ${ envFileParam } ` ;
437
450
438
451
return new Promise ( ( resolve , reject ) => {
439
452
exec ( `${ cmd } ps --services --filter status=running` , { cwd } , ( error , stdout ) => {
@@ -466,17 +479,27 @@ export async function terminalWithDocker(): Promise<vscode.Terminal> {
466
479
const terminalName = `ObjectScript:${ workspace } ` ;
467
480
let terminal = terminals . find ( ( t ) => t . name == terminalName && t . exitStatus == undefined ) ;
468
481
if ( ! terminal ) {
469
- const exe = process . platform === "win32" ? "docker-compose.exe" : "docker-compose" ;
470
- terminal = vscode . window . createTerminal ( terminalName , exe , [
471
- "-f" ,
472
- file ,
473
- "exec" ,
474
- service ,
475
- "/bin/bash" ,
476
- "-c" ,
477
- `[ -f /tmp/vscodesession.pid ] && kill $(cat /tmp/vscodesession.pid) >/dev/null 2>&1 ; echo $$ > /tmp/vscodesession.pid;
482
+ let exe = await composeCommand ( ) ;
483
+ const argsArr : string [ ] = [ ] ;
484
+ if ( exe == "docker compose" ) {
485
+ const exeSplit = exe . split ( " " ) ;
486
+ exe = exeSplit [ 0 ] ;
487
+ argsArr . push ( exeSplit [ 1 ] ) ;
488
+ }
489
+ terminal = vscode . window . createTerminal (
490
+ terminalName ,
491
+ exe ,
492
+ argsArr . concat ( [
493
+ "-f" ,
494
+ file ,
495
+ "exec" ,
496
+ service ,
497
+ "/bin/bash" ,
498
+ "-c" ,
499
+ `[ -f /tmp/vscodesession.pid ] && kill $(cat /tmp/vscodesession.pid) >/dev/null 2>&1 ; echo $$ > /tmp/vscodesession.pid;
478
500
$(command -v ccontrol || command -v iris) session $ISC_PACKAGE_INSTANCENAME -U ${ ns } ` ,
479
- ] ) ;
501
+ ] )
502
+ ) ;
480
503
terminals . push ( terminal ) ;
481
504
}
482
505
terminal . show ( true ) ;
@@ -491,8 +514,18 @@ export async function shellWithDocker(): Promise<vscode.Terminal> {
491
514
const terminalName = `Shell:${ workspace } ` ;
492
515
let terminal = terminals . find ( ( t ) => t . name == terminalName && t . exitStatus == undefined ) ;
493
516
if ( ! terminal ) {
494
- const exe = process . platform === "win32" ? "docker-compose.exe" : "docker-compose" ;
495
- terminal = vscode . window . createTerminal ( terminalName , exe , [ "-f" , file , "exec" , service , "/bin/bash" ] ) ;
517
+ let exe = await composeCommand ( ) ;
518
+ const argsArr : string [ ] = [ ] ;
519
+ if ( exe == "docker compose" ) {
520
+ const exeSplit = exe . split ( " " ) ;
521
+ exe = exeSplit [ 0 ] ;
522
+ argsArr . push ( exeSplit [ 1 ] ) ;
523
+ }
524
+ terminal = vscode . window . createTerminal (
525
+ terminalName ,
526
+ exe ,
527
+ argsArr . concat ( [ "-f" , file , "exec" , service , "/bin/bash" ] )
528
+ ) ;
496
529
terminals . push ( terminal ) ;
497
530
}
498
531
terminal . show ( true ) ;
0 commit comments