Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 17 additions & 6 deletions src/container-cleanup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,22 @@ export async function collectDiagnosticLogs(workDir: string): Promise<void> {
logger.info(`Diagnostic logs collected at: ${diagnosticsDir}`);
}

/**
* Runs `docker compose down -v -t 1` with the standard AWF options.
*/
export async function runComposeDown(
workDir: string,
options: { reject?: boolean } = {},
): Promise<void> {
await execa('docker', ['compose', 'down', '-v', '-t', '1'], {
cwd: workDir,
stdout: process.stderr,
stderr: 'inherit',
env: getLocalDockerEnv(),
reject: options.reject ?? true,
});
}

/**
* Stops and removes Docker Compose services
*/
Expand All @@ -184,12 +200,7 @@ export async function stopContainers(workDir: string, keepContainers: boolean):
logger.info('Stopping containers...');

try {
await execa('docker', ['compose', 'down', '-v', '-t', '1'], {
cwd: workDir,
stdout: process.stderr,
stderr: 'inherit',
env: getLocalDockerEnv(),
});
await runComposeDown(workDir);
logger.success('Containers stopped successfully');
} catch (error) {
logger.error('Failed to stop containers:', error);
Expand Down
9 changes: 2 additions & 7 deletions src/container-lifecycle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import execa from 'execa';
import { BlockedTarget } from './types';
import { logger } from './logger';
import { parseDomainWithProtocol, isWildcardPattern, wildcardToRegex } from './domain-patterns';
import { runComposeDown } from './container-cleanup';
import {
AGENT_CONTAINER_NAME,
SQUID_CONTAINER_NAME,
Expand Down Expand Up @@ -218,13 +219,7 @@ export async function startContainers(workDir: string, allowedDomains: string[],

// Tear down before retry so Docker Compose starts fresh
try {
await execa('docker', ['compose', 'down', '-v', '-t', '1'], {
cwd: workDir,
stdout: process.stderr,
stderr: 'inherit',
env: getLocalDockerEnv(),
reject: false,
});
await runComposeDown(workDir, { reject: false });
} catch (cleanupError) {
// Best-effort cleanup — proceed with retry regardless
logger.debug('Cleanup before retry failed (proceeding anyway):', cleanupError);
Expand Down
5 changes: 5 additions & 0 deletions src/docker-manager-lifecycle.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ describe('docker-manager lifecycle', () => {
call[0] === 'docker' && Array.isArray(call[1]) && call[1].includes('up')
);
expect(upCalls).toHaveLength(2);
expect(mockExecaFn).toHaveBeenCalledWith(
'docker',
['compose', 'down', '-v', '-t', '1'],
expect.objectContaining({ cwd: testDir, stdout: process.stderr, stderr: 'inherit', reject: false })
);
});

it('should retry once when awf-api-proxy exits during startup', async () => {
Expand Down
Loading