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

  1. Check server logs for the exact volume cleanup error
  2. Ensure no container is using the volumes: docker ps -a --filter volume=<name>, stop/remove it (docker rm -f), then retry
  3. Remove volumes manually: docker volume rm <service-volumes>, then re-run force-reinstall
  4. 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

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


AI-assisted analysis of Crosstalk-Solutions/project-nomad@0bd1c6f4f9 (2026-08-27). Data as JSON: /api/errors/776f36e755881078. Report an issue: GitHub.