dagger/dagger · error

failed to get client caller: %w

Error message

failed to get client caller: %w

What it means

Client.WriteImage resolves the host-service caller for the requesting client (md.ClientID) via GetHostServiceCaller. If that lookup fails, the error is wrapped as "failed to get client caller: %w". This is the engine's way of saying it couldn't establish the back-connection to the calling client needed to stream image content.

Source

Thrown at engine/engineutil/client.go:1015

	pipeIOClient, err := pipe.NewPipeClient(caller.Conn()).IO(ctx)
	if err != nil {
		return nil, fmt.Errorf("failed to open pipe: %w", err)
	}
	// io.ReadWriter wrapper
	return &pipe.PipeIO{GRPC: pipeIOClient}, nil
}

func (c *Client) WriteImage(
	ctx context.Context,
	name string,
) (*ImageWriter, error) {
	md, err := engine.ClientMetadataFromContext(ctx)
	if err != nil {
		return nil, err
	}
	caller, err := c.GetHostServiceCaller(ctx, md.ClientID)
	if err != nil {
		return nil, fmt.Errorf("failed to get client caller: %w", err)
	}

	if callerSupports(caller, &contentapi.Content_ServiceDesc) {
		return &ImageWriter{
			ContentStore: contentproxy.NewContentStore(contentapi.NewContentClient(caller.Conn())),
			ImagesStore:  containerd.NewImageStoreFromClient(imagesapi.NewImagesClient(caller.Conn())),
			LeaseManager: leasesproxy.NewLeaseManager(leasesapi.NewLeasesClient(caller.Conn())),
		}, nil
	}

	if callerSupports(caller, &store.BasicStore_serviceDesc) {
		loadClient := store.NewBasicStoreClient(caller.Conn())
		ctx = metadata.AppendToOutgoingContext(ctx, store.ImageTagKey, name)
		tarballWriter, err := loadClient.WriteTarball(ctx)
		if err != nil {
			return nil, fmt.Errorf("failed to open tarball pipe: %w", err)
		}
		return &ImageWriter{

View on GitHub (pinned to 82ba2681db)

Solutions

  1. Verify the dagger CLI session that started the function is still running
  2. Re-run the operation with a fresh `dagger call`
  3. Check engine connectivity (`dagger core version`) before long exports
  4. Upgrade CLI/engine if session teardown during long functions recurs
Defensive patterns

Strategy: try-catch

Try / catch

img, err := dag.Container().From("alpine")
if err != nil { /* ... */ }
// on export failure mentioning 'failed to get client caller', restart the dagger call:
if strings.Contains(err.Error(), "failed to get client caller") {
    return retryWithFreshSession(ctx)
}

Prevention

When it happens

Trigger: engine.ClientMetadataFromContext succeeded but GetHostServiceCaller(ctx, md.ClientID) fails — the client's host service is no longer registered, the client ID is stale, or the session was torn down.

Common situations: Containerd export of an image (e.g. Image.export in a function) while the CLI client disconnected; long-running functions outliving the client session; engine restart invalidating client IDs.

Related errors


AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05). Data as JSON: /api/errors/4e98c953f67031c3. Report an issue: GitHub.