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
- Verify the dagger CLI session that started the function is still running
- Re-run the operation with a fresh `dagger call`
- Check engine connectivity (`dagger core version`) before long exports
- 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
- Keep the originating `dagger call` process alive for the whole function duration
- Avoid exporting images from functions that outlive the client session
- Check engine connectivity before long-running export operations
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
- start session: %w
- connect session attachables: %w
- failed to get client caller for %q: %w
- failed to get main client caller: %w
- failed to get requester session: %w
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/4e98c953f67031c3.
Report an issue: GitHub.