@@ -9,6 +9,7 @@ import * as ptyType from 'node-pty';
99import { Log , makeLog } from '../spec-utils/log' ;
1010import { Event } from '../spec-utils/event' ;
1111import { escapeRegExCharacters } from '../spec-utils/strings' ;
12+ import { delay } from '../spec-common/async' ;
1213
1314export interface ContainerDetails {
1415 Id : string ;
@@ -168,15 +169,52 @@ export async function listContainers(params: DockerCLIParameters | PartialExecPa
168169 . filter ( s => ! ! s ) ;
169170}
170171
171- export async function getEvents ( params : DockerResolverParameters , filters ?: Record < string , string [ ] > ) {
172+ export async function removeContainer ( params : DockerCLIParameters | PartialExecParameters | DockerResolverParameters , nameOrId : string ) {
173+ let eventsProcess : Exec | undefined ;
174+ let removedSeenP : Promise < void > | undefined ;
175+ try {
176+ for ( let i = 0 , n = 4 ; i < n ; i ++ ) {
177+ try {
178+ await dockerCLI ( params , 'rm' , '-f' , nameOrId ) ;
179+ return ;
180+ } catch ( err ) {
181+ // https://github.com/microsoft/vscode-remote-release/issues/6509
182+ const stderr : string = err ?. stderr ?. toString ( ) . toLowerCase ( ) || '' ;
183+ if ( i === n - 1 || ! stderr . includes ( 'already in progress' ) ) {
184+ throw err ;
185+ }
186+ if ( ! removedSeenP ) {
187+ eventsProcess = await getEvents ( params , {
188+ container : [ nameOrId ] ,
189+ event : [ 'destroy' ] ,
190+ } ) ;
191+ removedSeenP = new Promise < void > ( resolve => {
192+ eventsProcess ! . stdout . on ( 'data' , ( ) => {
193+ resolve ( ) ;
194+ eventsProcess ! . terminate ( ) ;
195+ removedSeenP = new Promise ( ( ) => { } ) ; // safeguard in case we see the 'removal already in progress' error again
196+ } ) ;
197+ } ) ;
198+ }
199+ await Promise . race ( [ removedSeenP , delay ( 1000 ) ] ) ;
200+ }
201+ }
202+ } finally {
203+ if ( eventsProcess ) {
204+ eventsProcess . terminate ( ) ;
205+ }
206+ }
207+ }
208+
209+ export async function getEvents ( params : DockerCLIParameters | PartialExecParameters | DockerResolverParameters , filters ?: Record < string , string [ ] > ) {
172210 const { exec, cmd, args, env, output } = toExecParameters ( params ) ;
173211 const filterArgs = [ ] ;
174212 for ( const filter in filters ) {
175213 for ( const value of filters [ filter ] ) {
176214 filterArgs . push ( '--filter' , `${ filter } =${ value } ` ) ;
177215 }
178216 }
179- const format = params . isPodman ? 'json' : '{{json .}}' ; // https://github.com/containers/libpod/issues/5981
217+ const format = 'isPodman' in params && params . isPodman ? 'json' : '{{json .}}' ; // https://github.com/containers/libpod/issues/5981
180218 const combinedArgs = ( args || [ ] ) . concat ( [ 'events' , '--format' , format , ...filterArgs ] ) ;
181219
182220 const p = await exec ( {
0 commit comments