Skip to main content

Develop a new CUE package for Dagger


This documentation is for an older version of Dagger, which is no longer actively maintained.

We encourage you to upgrade and refer to the documentation for the most current version.

If you cannot upgrade to the latest version, please contact us in the help forum on Discord. When contacting us, please let us know why you cannot move to the latest version. From there, our team will work with you on your use case.

This tutorial illustrates how to create new packages, manually distribute them among your applications and contribute to the Dagger stdlib packages.

Creating your package

Initializing project

Create an empty directory for your new Dagger project:

mkdir project
cd project

As described in the previous tutorials, initialize your Dagger project:

dagger init

That will create two directories: .dagger and cue.mod, where our package will reside:

├── cue.mod
│ ├── module.cue
│ ├── pkg
│ └── usr
├── .dagger
│ └── env

Writing the package

Now that you've initialized your project, it's time to write a simple package. Package name usually starts with a domain name (as in Go) followed by a descriptive name. In this example, we reuse the Cloud Run example and create a package from it.

mkdir -p cue.mod/pkg/

Let's write the package logic. It is basically what we've seen in the 106-cloudrun example:

touch cue.mod/pkg/
package gcpcloudrun

import (

#Run: {
// Source code of the sample application
src: dagger.#Artifact & dagger.#Input

// GCR full image name
imageRef: string & dagger.#Input

image: docker.#Build & {
source: src

gcpConfig: gcp.#Config

creds: gcr.#Credentials & {
config: gcpConfig

push: docker.#Push & {
target: imageRef
source: image
auth: {
username: creds.username
secret: creds.secret

deploy: cloudrun.#Service & {
config: gcpConfig
image: push.ref

Running the package

Now that you've successfully created a package let's run it in a new environment. Create a new test package using our reusable gcpcloudrun:

mkdir -p test

cat > test/source.cue << EOF
package test

import (

run: gcpcloudrun.#Run

dagger new staging -p ./test

Run it:

dagger up -e staging

You should see a familiar output:

9:32AM ERR system | required input is missing    input=run.src
9:32AM ERR system | required input is missing input=run.imageRef
9:32AM ERR system | required input is missing input=run.gcpConfig.region
9:32AM ERR system | required input is missing input=run.gcpConfig.project
9:32AM ERR system | required input is missing input=run.gcpConfig.serviceKey
9:32AM ERR system | required input is missing
9:32AM FTL system | some required inputs are not set, please re-run with `--force` if you think it's a mistake missing=0s

Manually distributing packages

You've probably guessed this package isn't tied to just your project. You can easily copy/paste it into any number of different projects and use it as we've shown above.

mkdir -p /my-new-workspace/cue.mod/pkg/
cp ./cue.mod/pkg/ /new-workspace/cue.mod/pkg/

Contributing to Dagger stdlib

Our stdlib has many valuable packages that you can use. You've probably seen it when you've initialized your project:

├── cue.mod
│ ├── module.cue
│ ├── pkg
│ │ ├──
│ │ └── .gitignore
│ └── usr

We are still a small community and are constantly looking for new contributors that will work with us to improve this fantastic project. If you feel like we are missing a package or want to improve an existing one, please start with our contributing docs and open a PR.