schema

package
v0.21.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 22, 2026 License: Apache-2.0 Imports: 74 Imported by: 1

README

Core API proposal

This directory contains a proposal for a complete GraphQL API for Dagger. It is written with the following goals in mind:

  1. Feature parity with Dagger 0.2
  2. Close to feature parity with Buildkit, with an incremental path to reaching full parity in the future
  3. Follow established graphql best practices
  4. Sove as many outstanding DX problems as possible

Reference

DX problems solved

Some problems in the DX that are not yet resolved, and this proposal would help solve, include:

  • Uncertainty as to how to express uploads in a graphql-friendly way (deployment, image push, git push, etc)
  • Chaining of FS operations greatly reduces verbosity, but cannot be applied all the time
  • Transitioning a script to an extension requires non-trivial refactoring, to tease apart the script-specific code from the underlying "API".
  • The API sandbox is amazing for prototyping small queries, but of limited use when multiple queries must reference each other. This is because the native code doing the stitching cannot be run by the playground, so filesystem IDs must be manually copy-pasted between queries.

Design highlights

withX and withoutX

To avoid the use of rpc-style verbs (a graphql best practice) and maximize chaining (a strength of our DX), we use the terminology withX and withoutX.

A field of the form withX returns the same object with content X added or changed.

Example:

"An empty directory with a README copied to it"
query readmeDir($readme: FileID!) {
  directory {
    withFile(source: $readme, path: "README.md") {
      id
    }
}

"An empty container with an app directory mounted into it"
query appContainer($app: DirectoryID!) {
  container {
    withMountedDirectory(source: $app, path: "/app") {
      id
    }
  }
}

A field of the form withoutX returns the same object with content X removed.

"Remove node_modules from a JS project"
query removeNodeModules($dir: DirectoryID!) {
  directory(id: $dir) {
    withoutDirectory(path: "node_modules") {
      id
    }
  }
}
Secrets

Secret handling has been simplified and made more consistent with Directory handling.

  • Secrets have an ID, and can be loaded by ID in the standard graphql manner
  • Secrets can be created in one of two ways:
    1. From an environment variable: type Environment { secret }
    2. From a file: type Directory { secret }
Embrace the llb / Dockerfile model

The Container type proposes an expansive definition of the container, similar to the Buildkit/Dockerfile model. A Container is:

  1. A filesystem state
  2. An OCI artifact which can be pulled from, and pushed to a repository at any time
  3. A persistent configuration to be applied to all commands executed inside it

This is similar to how buildkit models llb state, and how the Dockerfile language models stage state. Note that Dagger extends this model to include even mount configuration (which are scoped to exec in buildkit, but scoped to container in dagger).

Examples:

"""
Download a file over HTTP in a very convoluted way:

1. Download a base linux container
2. Install curl
3. Download the file into the container
4. Load and return the file
"""
query convolutedDownload($url: String!) {
  container {
    from(address: "index.docker.io/alpine:latest") {
      exec(args: ["apk", "add", "curl"]) {
        exec(args: ["curl", "-o", "/tmp/download", $url) {
          file(path: "/tmp/download") {
            id
         }
      }
    }
  }
}

"""
Specialize two containers from a common base
"""
query twoContainers {
  container {
    from(address: "alpine") {
      debug: withVariable(name: "DEBUG", value: "1") {
        id
        exec(args: ["env"]) {
          stdout
        }
      }
      noDebug: withVariable(name: "DEBUG", value: "0") {
        id
        exec(args: ["env"]) {
          stdout
        }
      }
    }
  }
}

Documentation

Index

Constants

View Source
const InstrumentationLibrary = "dagger.io/engine.schema"

Variables

View Source
var (
	FailEarlyOnMergeConflict = ChangesetMergeConflictEnum.RegisterView("FAIL_EARLY",

		AfterVersion("v0.15.0"),
		`Fail before attempting merge if file-level conflicts are detected`)
	FailOnMergeConflict = ChangesetMergeConflictEnum.RegisterView("FAIL",
		AfterVersion("v0.15.0"),
		`Attempt the merge and fail if git merge fails due to conflicts`)
	LeaveConflictMarkersOnMergeConflict = ChangesetMergeConflictEnum.Register("LEAVE_CONFLICT_MARKERS",
		`Let git create conflict markers in files. For modify/delete conflicts, keeps the modified version. Fails on binary conflicts.`)
	PreferOursOnMergeConflict = ChangesetMergeConflictEnum.Register("PREFER_OURS",
		`The conflict is resolved by applying the version of the calling changeset`)
	PreferTheirsOnMergeConflict = ChangesetMergeConflictEnum.Register("PREFER_THEIRS",
		`The conflict is resolved by applying the version of the other changeset`)
)
View Source
var (
	FailEarlyOnMergeConflicts = ChangesetsMergeConflictEnum.Register("FAIL_EARLY",
		`Fail before attempting merge if file-level conflicts are detected between any changesets`)
	FailOnMergeConflicts = ChangesetsMergeConflictEnum.Register("FAIL",
		`Attempt the octopus merge and fail if git merge fails due to conflicts`)
)
View Source
var AllVersion = core.AllVersion
View Source
var ChangesetMergeConflictEnum = dagql.NewEnum[ChangesetMergeConflict]()
View Source
var ChangesetsMergeConflictEnum = dagql.NewEnum[ChangesetsMergeConflict]()

Functions

func BuildLegacyAsModuleArgs added in v0.21.0

func BuildLegacyAsModuleArgs(
	nameOverride string,
	legacyDefaultPath bool,
	defaultPathContextSourceRef string,
	defaultPathContextSourcePin string,
	configDefaults map[string]any,
	defaultsFromDotEnv bool,
	argCustomizations []*modules.ModuleConfigArgument,
) ([]dagql.NamedInput, error)

load the given module source's dependencies as modules BuildLegacyAsModuleArgs is the single builder for the asModule args salted into AsModuleVariantDigest, so every load path yields one module identity.

func IsRemotePublic added in v0.19.0

func IsRemotePublic(ctx context.Context, remote *gitutil.GitURL) (bool, error)

func SchemaIntrospectionJSON added in v0.11.7

func SchemaIntrospectionJSON(ctx context.Context, dag *dagql.Server) (json.RawMessage, error)

func Syncer added in v0.9.7

func Syncer[T dagql.Typed]() dagql.Field[T]

Types

type AfterVersion added in v0.12.0

type AfterVersion = core.AfterVersion

type BeforeVersion added in v0.12.0

type BeforeVersion = core.BeforeVersion

type ChangesetMergeConflict added in v0.19.11

type ChangesetMergeConflict string

func (ChangesetMergeConflict) Decoder added in v0.19.11

func (proto ChangesetMergeConflict) Decoder() dagql.InputDecoder

func (ChangesetMergeConflict) ToLiteral added in v0.19.11

func (proto ChangesetMergeConflict) ToLiteral() call.Literal

func (ChangesetMergeConflict) Type added in v0.19.11

func (proto ChangesetMergeConflict) Type() *ast.Type

func (ChangesetMergeConflict) TypeDescription added in v0.19.11

func (proto ChangesetMergeConflict) TypeDescription() string

type ChangesetsMergeConflict added in v0.19.11

type ChangesetsMergeConflict string

ChangesetsMergeConflict is the enum for octopus merge conflict strategies (WithChangesets). Only FAIL_EARLY and FAIL are supported (no -X ours/theirs with octopus merge).

func (ChangesetsMergeConflict) Decoder added in v0.19.11

func (proto ChangesetsMergeConflict) Decoder() dagql.InputDecoder

func (ChangesetsMergeConflict) ToLiteral added in v0.19.11

func (proto ChangesetsMergeConflict) ToLiteral() call.Literal

func (ChangesetsMergeConflict) Type added in v0.19.11

func (proto ChangesetsMergeConflict) Type() *ast.Type

func (ChangesetsMergeConflict) TypeDescription added in v0.19.11

func (proto ChangesetsMergeConflict) TypeDescription() string

type CoreMod added in v0.9.4

type CoreMod struct {
	// contains filtered or unexported fields
}

func (*CoreMod) ForkSchema added in v0.21.0

func (m *CoreMod) ForkSchema(ctx context.Context, root *core.Query, view call.View) (*dagql.Server, error)

func (*CoreMod) GetSource added in v0.18.3

func (m *CoreMod) GetSource() *core.ModuleSource

GetSource returns an empty module source

func (*CoreMod) Install added in v0.9.7

func (m *CoreMod) Install(ctx context.Context, dag *dagql.Server, _ ...core.InstallOpts) error

func (*CoreMod) ModTypeFor added in v0.9.4

func (m *CoreMod) ModTypeFor(ctx context.Context, typeDef *core.TypeDef, checkDirectDeps bool) (core.ModType, bool, error)

func (*CoreMod) ModuleResult added in v0.21.0

func (m *CoreMod) ModuleResult() dagql.ObjectResult[*core.Module]

func (*CoreMod) Name added in v0.9.4

func (m *CoreMod) Name() string

func (*CoreMod) ResultCallModule added in v0.21.0

func (m *CoreMod) ResultCallModule(context.Context) (*dagql.ResultCallModule, error)

func (*CoreMod) Same added in v0.21.0

func (m *CoreMod) Same(other core.Mod) (bool, error)

func (*CoreMod) TypeDefs added in v0.9.6

func (*CoreMod) View added in v0.12.0

func (m *CoreMod) View() (call.View, bool)

func (*CoreMod) WithView added in v0.21.0

func (m *CoreMod) WithView(view call.View) *CoreMod

type CoreModEnum added in v0.12.0

type CoreModEnum struct {
	// contains filtered or unexported fields
}

func (*CoreModEnum) CollectContent added in v0.20.0

func (enum *CoreModEnum) CollectContent(ctx context.Context, value dagql.AnyResult, content *core.CollectedContent) error

func (*CoreModEnum) ConvertFromSDKResult added in v0.12.0

func (enum *CoreModEnum) ConvertFromSDKResult(ctx context.Context, value any) (dagql.AnyResult, error)

func (*CoreModEnum) ConvertToSDKInput added in v0.12.0

func (enum *CoreModEnum) ConvertToSDKInput(ctx context.Context, value dagql.Typed) (any, error)

func (*CoreModEnum) SourceMod added in v0.12.0

func (enum *CoreModEnum) SourceMod() core.Mod

func (*CoreModEnum) TypeDef added in v0.12.0

func (enum *CoreModEnum) TypeDef(ctx context.Context) (dagql.ObjectResult[*core.TypeDef], error)

type CoreModObject added in v0.9.4

type CoreModObject struct {
	// contains filtered or unexported fields
}

CoreModObject represents objects from core (Container, Directory, etc.)

func (*CoreModObject) CollectContent added in v0.20.0

func (obj *CoreModObject) CollectContent(ctx context.Context, value dagql.AnyResult, content *core.CollectedContent) error

func (*CoreModObject) ConvertFromSDKResult added in v0.9.4

func (obj *CoreModObject) ConvertFromSDKResult(ctx context.Context, value any) (dagql.AnyResult, error)

func (*CoreModObject) ConvertToSDKInput added in v0.9.4

func (obj *CoreModObject) ConvertToSDKInput(ctx context.Context, value dagql.Typed) (any, error)

func (*CoreModObject) SourceMod added in v0.9.4

func (obj *CoreModObject) SourceMod() core.Mod

func (*CoreModObject) TypeDef added in v0.9.6

type CoreModScalar added in v0.11.3

type CoreModScalar struct {
	// contains filtered or unexported fields
}

CoreModScalar represents scalars from core (Platform, etc)

func (*CoreModScalar) CollectContent added in v0.20.0

func (obj *CoreModScalar) CollectContent(ctx context.Context, value dagql.AnyResult, content *core.CollectedContent) error

func (*CoreModScalar) ConvertFromSDKResult added in v0.11.3

func (obj *CoreModScalar) ConvertFromSDKResult(ctx context.Context, value any) (dagql.AnyResult, error)

func (*CoreModScalar) ConvertToSDKInput added in v0.11.3

func (obj *CoreModScalar) ConvertToSDKInput(ctx context.Context, value dagql.Typed) (any, error)

func (*CoreModScalar) SourceMod added in v0.11.3

func (obj *CoreModScalar) SourceMod() core.Mod

func (*CoreModScalar) TypeDef added in v0.11.3

type CoreSchemaBase added in v0.21.0

type CoreSchemaBase struct {
	// contains filtered or unexported fields
}

CoreMod is a special implementation of Mod for our core API, which is not *technically* a true module yet but can be treated as one in terms of dependencies. It has no dependencies itself and is currently an implicit dependency of every user module.

func NewCoreSchemaBase added in v0.21.0

func NewCoreSchemaBase(ctx context.Context, rootSrv core.Server) (*CoreSchemaBase, error)

func (*CoreSchemaBase) CoreMod added in v0.21.0

func (base *CoreSchemaBase) CoreMod(view call.View) *CoreMod

func (*CoreSchemaBase) Fork added in v0.21.0

func (base *CoreSchemaBase) Fork(ctx context.Context, root *core.Query, view call.View) (*dagql.Server, error)

type ErrSDKClientGeneratorNotImplemented added in v0.18.10

type ErrSDKClientGeneratorNotImplemented struct {
	SDK string
}

func (ErrSDKClientGeneratorNotImplemented) Error added in v0.18.10

type ErrSDKCodegenNotImplemented added in v0.18.10

type ErrSDKCodegenNotImplemented struct {
	SDK string
}

func (ErrSDKCodegenNotImplemented) Error added in v0.18.10

func (err ErrSDKCodegenNotImplemented) Error() string

type ErrSDKRuntimeNotImplemented added in v0.18.10

type ErrSDKRuntimeNotImplemented struct {
	SDK string
}

func (ErrSDKRuntimeNotImplemented) Error added in v0.18.10

func (err ErrSDKRuntimeNotImplemented) Error() string

type FilterArgs added in v0.17.2

type FilterArgs struct {
	core.CopyFilter
}

type HealthcheckConfig added in v0.20.1

type HealthcheckConfig struct {
	Args          []string `field:"true" doc:"Healthcheck command arguments."`
	Shell         bool     `field:"true" doc:"Healthcheck command is a shell command."`
	Timeout       string   `field:"true" doc:"Healthcheck timeout. Example:3s"`
	Interval      string   `field:"true" doc:"Interval between running healthcheck. Example:30s"`
	StartPeriod   string   `` /* 150-byte string literal not displayed */
	StartInterval string   `field:"true" doc:"StartInterval configures the duration between checks during the startup phase. Example:5s"`
	Retries       int      `field:"true" doc:"The maximum number of consecutive failures before the container is marked as unhealthy. Example:3"`
}

func (HealthcheckConfig) Type added in v0.20.1

func (HealthcheckConfig) Type() *ast.Type

func (HealthcheckConfig) TypeDescription added in v0.20.1

func (HealthcheckConfig) TypeDescription() string

type HostDirCacheConfig added in v0.18.9

type HostDirCacheConfig struct {
	NoCache bool `default:"false"`
}

type Label added in v0.3.10

type Label struct {
	Name  string `field:"true" doc:"The label name."`
	Value string `field:"true" doc:"The label value."`
}

func (Label) Type added in v0.9.7

func (Label) Type() *ast.Type

func (Label) TypeDescription added in v0.9.7

func (Label) TypeDescription() string

type PipelineLabel added in v0.11.0

type PipelineLabel struct {
	Name  string `field:"true" doc:"Label name."`
	Value string `field:"true" doc:"Label value."`
}

PipelineLabel is deprecated and has no effect.

func (PipelineLabel) TypeDescription added in v0.11.0

func (PipelineLabel) TypeDescription() string

func (PipelineLabel) TypeName added in v0.11.0

func (PipelineLabel) TypeName() string

type SchemaResolvers added in v0.9.4

type SchemaResolvers interface {
	Install(*dagql.Server)
}

type UpArgs added in v0.15.2

type UpArgs struct {
	Ports  []dagql.InputObject[core.PortForward] `default:"[]"`
	Random bool                                  `default:"false"`
}

type WithDirectoryArgs added in v0.9.7

type WithDirectoryArgs struct {
	Path        string
	Owner       string `default:""`
	Permissions dagql.Optional[dagql.Int]

	Source    core.DirectoryID
	Directory core.DirectoryID // legacy, use Source instead

	core.CopyFilter
}

type WithDirectoryDockerfileCompatArgs added in v0.21.0

type WithDirectoryDockerfileCompatArgs struct {
	Path        string
	Owner       string `default:""`
	Permissions dagql.Optional[dagql.Int]

	SrcPath                          string `internal:"true" default:""`
	FollowSymlink                    bool   `internal:"true" default:"false"`
	DirCopyContents                  bool   `internal:"true" default:"false"`
	AttemptUnpackDockerCompatibility bool   `internal:"true" default:"false"`
	CreateDestPath                   bool   `internal:"true" default:"false"`
	AllowWildcard                    bool   `internal:"true" default:"false"`
	AllowEmptyWildcard               bool   `internal:"true" default:"false"`
	AlwaysReplaceExistingDestPaths   bool   `internal:"true" default:"false"`

	Source core.DirectoryID

	core.CopyFilter
}

type WithFileArgs added in v0.9.7

type WithFileArgs struct {
	Path        string
	Source      core.FileID
	Permissions dagql.Optional[dagql.Int]
	Owner       string `default:""`
	// Hidden internal arg used for LLB fidelity; default preserves existing behavior.
	DoNotCreateDestPath bool `internal:"true" default:"false"`
	// Hidden internal arg used for LLB fidelity; when set, copy behavior matches
	// BuildKit ADD archive auto-unpack compatibility semantics.
	AttemptUnpackDockerCompatibility bool `internal:"true" default:"false"`
}

type WithFilesArgs added in v0.9.10

type WithFilesArgs struct {
	Path        string
	Sources     []core.FileID
	Permissions dagql.Optional[dagql.Int]
}

type WithHealthcheckArgs added in v0.20.1

type WithHealthcheckArgs struct {
	Args          []string
	Shell         dagql.Optional[dagql.Boolean]
	Timeout       dagql.Optional[dagql.String]
	Interval      dagql.Optional[dagql.String]
	StartPeriod   dagql.Optional[dagql.String]
	StartInterval dagql.Optional[dagql.String]
	Retries       dagql.Optional[dagql.Int]
}

type WithNewFileArgs added in v0.18.13

type WithNewFileArgs struct {
	Path        string
	Contents    string
	Permissions int `default:"0644"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL