docs/current_docs/getting-started/api/clients-cli.mdx
The Dagger CLI lets you call both the core and extended Dagger API (the core APIs plus the new APIs provided by external Dagger modules) directly from the command-line.
You can call the API interactively (dagger) or non-interactively (dagger -c, dagger call, or dagger core).
Here are a few examples:
Create a simple workflow that is fully satisfied by the core Dagger API, without needing to program a Dagger module:
<Tabs groupId="shell">
<TabItem value="System shell">
```shell
dagger <<EOF
container |
from cgr.dev/chainguard/wolfi-base |
with-exec apk add go |
with-directory /src https://github.com/golang/example#master |
with-workdir /src/hello |
with-exec -- go build -o hello . |
file ./hello |
export ./hello-from-dagger
EOF
```
</TabItem>
<TabItem value="Dagger Shell">
```shell title="First type 'dagger' for interactive mode."
container |
from cgr.dev/chainguard/wolfi-base |
with-exec apk add go |
with-directory /src https://github.com/golang/example#master |
with-workdir /src/hello |
with-exec -- go build -o hello . |
file ./hello |
export ./hello-from-dagger
```
</TabItem>
<TabItem value="Dagger CLI">
```shell
dagger core container from --address="cgr.dev/chainguard/wolfi-base" \
with-exec --args="apk","add","go" \
with-directory --path="/src" --source="https://github.com/golang/example#master" \
with-workdir --path="/src/hello" \
with-exec --args="go","build","-o","hello","." \
file --path="./hello" \
export --path="./hello-from-dagger"
```
</TabItem>
</Tabs>
Use Dagger as an alternative to docker run.
<Tabs>
<TabItem value="System shell">
```shell
dagger -c 'container | from cgr.dev/chainguard/wolfi-base | terminal'
```
</TabItem>
<TabItem value="Dagger Shell">
```shell title="First type 'dagger' for interactive mode."
container | from cgr.dev/chainguard/wolfi-base | terminal
```
</TabItem>
<TabItem value="Dagger CLI">
```shell
dagger core container \
from --address=cgr.dev/chainguard/wolfi-base \
terminal
```
</TabItem>
</Tabs>
:::tip
If only the core Dagger API is needed, the `-M` (`--no-mod`) flag can be provided. This results in quicker startup, because the Dagger CLI doesn't try to find and load a current module. This also makes `dagger -M` equivalent to `dagger core`.
:::
Call one of the auto-generated Dagger Functions:
<Tabs>
<TabItem value="System shell">
```shell
dagger -c 'container-echo "Welcome to Dagger!" | stdout'
```
</TabItem>
<TabItem value="Dagger Shell">
```shell title="First type 'dagger' for interactive mode."
container-echo "Welcome to Dagger!" | stdout
```
</TabItem>
<TabItem value="Dagger CLI">
```shell
dagger call container-echo --string-arg="Welcome to Dagger!" stdout
```
</TabItem>
</Tabs>
:::tip
When using the Dagger CLI, all names (functions, arguments, struct fields, etc) are converted into a shell-friendly "kebab-case" style.
:::
Modules don't need to be installed locally. Dagger lets you consume modules from GitHub repositories and call their Dagger Functions as though you were calling them locally:
<Tabs>
<TabItem value="System shell">
```shell
dagger <<EOF
github.com/jpadams/daggerverse/[email protected] |
scan-image ubuntu:latest
EOF
```
</TabItem>
<TabItem value="Dagger Shell">
```shell title="First type 'dagger' for interactive mode."
github.com/jpadams/daggerverse/[email protected] | scan-image ubuntu:latest
```
</TabItem>
<TabItem value="Dagger CLI">
```shell
dagger -m github.com/jpadams/daggerverse/[email protected] call \
scan-image --image-ref=ubuntu:latest
```
</TabItem>
</Tabs>
List all the Dagger Functions available in a module using context-sensitive help:
<Tabs>
<TabItem value="System shell">
```shell
dagger -c '.help github.com/jpadams/daggerverse/[email protected]'
```
</TabItem>
<TabItem value="Dagger Shell">
```shell title="First type 'dagger' for interactive mode."
.help github.com/jpadams/daggerverse/[email protected]
```
</TabItem>
<TabItem value="Dagger CLI">
```shell
dagger -m github.com/jpadams/daggerverse/[email protected] call --help
```
</TabItem>
</Tabs>
List all the optional and required arguments for a Dagger Function using context-sensitive help:
<Tabs>
<TabItem value="System shell">
```shell
dagger -c 'github.com/jpadams/daggerverse/[email protected] | scan-image | .help'
```
</TabItem>
<TabItem value="Dagger Shell">
```shell title="First type 'dagger' for interactive mode."
github.com/jpadams/daggerverse/[email protected] | scan-image | .help
```
</TabItem>
<TabItem value="Dagger CLI">
```shell
dagger -m github.com/jpadams/daggerverse/[email protected] call scan-image --help
```
</TabItem>
</Tabs>