stablyai/orca · error · Error

docker ${args[0]} failed: ${result.stderr} ${result.stdout}

Error message

docker ${args[0]} failed:
${result.stderr}
${result.stdout}

What it means

Thrown by the docker() wrapper in run-headless-linux-pairing-docker.mjs when an invoked docker subcommand fails (non-zero status, timeout, or execFileSync throw) AND the call was not made with allowFailure:true. The wrapper re-throws a normalized message including args[0], stderr, and stdout.

Source

Thrown at config/scripts/run-headless-linux-pairing-docker.mjs:421

function docker(args, options = {}) {
  try {
    const stdout = execFileSync('docker', args, {
      cwd: process.cwd(),
      encoding: 'utf8',
      maxBuffer: 50 * 1024 * 1024,
      stdio: options.allowFailure ? 'pipe' : ['ignore', 'pipe', 'inherit'],
      timeout: options.timeout
    })
    return { status: 0, stdout, stderr: '' }
  } catch (error) {
    const result = {
      status: typeof error.status === 'number' ? error.status : 1,
      stdout: String(error.stdout ?? ''),
      stderr: String(error.stderr ?? error.message)
    }
    if (!options.allowFailure) {
      throw new Error(`docker ${args[0]} failed:\n${result.stderr}\n${result.stdout}`)
    }
    return result
  }
}

function assert(condition, message) {
  if (!condition) {
    throw new Error(message)
  }
}

function fail(message) {
  console.error(message)
  process.exit(2)
}

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Run docker info / docker ps to confirm the daemon is up and the user has access.
  2. Pull the image (docker pull <image.tag>) before running to avoid pull-during-run failures.
  3. For log-heavy calls that overflow 50MB maxBuffer, page logs or call with allowFailure:true where appropriate.
  4. Read result.stderr in the message to resolve the specific docker error.

Example fix

// before
docker(['run', '-d', '--name', name, image.tag])
// after
try {
  docker(['run', '-d', '--name', name, image.tag])
} catch (err) {
  // err.message already contains 'docker run failed:\n<stderr>\n<stdout>'
  throw err
}
Defensive patterns

Strategy: try-catch

Validate before calling

function dockerAvailable() {
  try {
    execFileSync('docker', ['info'], { stdio: 'pipe' })
    return true
  } catch {
    return false
  }
}
if (!dockerAvailable()) throw new Error('docker daemon unavailable; start Docker first')

Type guard

function isDockerResult(value) {
  return value != null && typeof value.status === 'number' && typeof value.stdout === 'string'
}

Try / catch

try {
  return docker(['run', '-d', '--name', name, image.tag, launch])
} catch (err) {
  // err.message: 'docker run failed:\n<stderr>\n<stdout>'
  if (/permission denied|Cannot connect to the Docker daemon/.test(err.message)) {
    // start daemon / add user to docker group
  }
  throw err
}

Prevention

When it happens

Trigger: Any docker([...]) call without {allowFailure:true} that exits non-zero: docker run/rm/stop/inspect/logs/build where execFileSync throws, or where error.status is set. Also fires on the 50MB maxBuffer overflow or the configured per-call timeout.

Common situations: Docker daemon not running, permission denied (user not in docker group), image not pulled, name already in use, port already bound, maxBuffer exceeded by very chatty logs, or a timeout on a long pull.

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/0fac71794e8811ef. Report an issue: GitHub.