Crosstalk-Solutions/project-nomad · warning
Warning during volume cleanup. Check server logs for details
Error message
Warning during volume cleanup. Check server logs for details.
What it means
In forceReinstall, after container cleanup the volume-clearing step (docker.listVolumes + remove) is wrapped in a catch that logs the error and broadcasts a volume-cleanup-warning without aborting the reinstall. This means old persisted data may survive the reinstall. The underlying cause (volume in use, permission denied, daemon error) appears only in the server log entry [DockerService] Error during volume cleanup.
Source
Thrown at admin/app/services/docker_service.ts:447
for (const vol of serviceVolumes) {
try {
const volume = this.docker.getVolume(vol.Name)
await volume.remove({ force: true })
this._broadcast(serviceName, 'volume-removed', `Removed volume: ${vol.Name}`)
} catch (error: any) {
logger.warn(`Failed to remove volume ${vol.Name}: ${error.message}`)
}
}
if (serviceVolumes.length === 0) {
this._broadcast(serviceName, 'no-volumes', `No volumes found to clear`)
}
} catch (error: any) {
logger.warn({ err: error }, `[DockerService] Error during volume cleanup for ${serviceName}`)
this._broadcast(
serviceName,
'volume-cleanup-warning',
'Warning during volume cleanup. Check server logs for details.'
)
}
// Step 4: Mark service as uninstalled
service.installed = false
service.installation_status = 'installing'
await service.save()
this.invalidateServicesStatusCache()
// Step 5: Recreate the container
this._broadcast(serviceName, 'recreating', `Recreating container...`)
const containerConfig = this._parseContainerConfig(service.container_config)
// Execute installation asynchronously and handle cleanup
this._createContainer(service, containerConfig).catch(async (error) => {
logger.error(`Reinstallation failed for ${serviceName}: ${error.message}`)
await this._cleanupFailedInstallation(serviceName)View on GitHub (pinned to 0bd1c6f4f9)
Solutions
- Check server logs for the exact volume cleanup error
- Ensure no container is using the volumes: docker ps -a --filter volume=<name>, stop/remove it (docker rm -f), then retry
- Remove volumes manually: docker volume rm <service-volumes>, then re-run force-reinstall
- Verify Docker daemon health and volume driver availability
Example fix
// before
// force-reinstall with stale volumes in use
// after
await exec('docker rm -f my-service') // free the volumes first
await exec('docker volume rm my-service-data')
await adminApi.forceReinstall('my-service') Defensive patterns
Strategy: fallback
Validate before calling
// Ensure nothing holds the volumes before reinstalling
const inUse = await exec(`docker ps -q --filter volume=${volumeName}`)
if (inUse.stdout.trim()) {
await exec(`docker rm -f $(docker ps -q --filter volume=${volumeName})`)
}
await adminApi.forceReinstall(service) Type guard
const isVolumeCleanupWarning = (evt: { event?: string }): boolean =>
evt.event === 'volume-cleanup-warning'
if (isVolumeCleanupWarning(msg)) warnUser('Old data may persist after reinstall; check server logs') Prevention
- Remember the warning is non-fatal but stale data may survive — verify data reset after reinstall if that matters
- Handle both cleanup-warning and volume-cleanup-warning events in the install progress UI
- If persistent-data reset is required, remove volumes manually before force-reinstall
When it happens
Trigger: Force-reinstalling a service whose volumes are still attached to a running container (container removal failed or raced), volumes held by another container, or the Docker daemon denying volume removal. Empty volume list is handled gracefully (no-volumes); only actual list/remove errors trigger this.
Common situations: External Compose stack or another container mounting the same named volume; container cleanup warning (error 268) preceded this so the container still holds the volumes; Docker root permissions mismatch after daemon config change; NFS/bind-mount backed volumes that cannot be removed.
Related errors
- Warning during container cleanup. Check server logs for deta
- sysbench disk-write benchmark produced no parseable MiB/s —
- Sysbench command failed: ${error.message}
- Failed to get auth token from ${registry}: ${response.status
- No token returned from ${registry}
AI-assisted analysis of Crosstalk-Solutions/project-nomad@0bd1c6f4f9 (2026-08-27).
Data as JSON: /api/errors/776f36e755881078.
Report an issue: GitHub.