package mix
import (
"dagger.io/dagger"
"universe.dagger.io/docker"
)
#Get: #Run & {
// Applies to all environments
env: null
cache: {
build: null
deps: "locked"
}
container: command: {
name: "sh"
flags: "-c": "mix do deps.get"
// Compile Elixir dependencies, including the app
#Compile: #Run & {
build: "locked"
flags: "-c": "mix do deps.compile, compile"
// Run mix task with all necessary mounts so compiled artefacts get cached
// FIXME: add default image to hexpm/elixir:1.13.2-erlang-23.3.4.11-debian-bullseye-20210902
#Run: {
app: {
// Application name
name: string
// Application source code
source: dagger.#FS
// Mix environment
env: string | null
// Configure mix caching
// FIXME: simpler interface, eg. "ro" | "rw"
// Dependencies cache
deps: null | "locked"
// Build cache
build: null | "locked"
// Run mix in a docker container
container: docker.#Run & {
if env != null {
"env": MIX_ENV: env
workdir: mounts.app.dest
mounts: "app": {
contents: app.source
dest: "/mix/app"
if cache.deps != null {
mounts: deps: {
contents: dagger.#CacheDir & {
id: "\(app.name)_deps"
concurrency: cache.deps
dest: "\(mounts.app.dest)/deps"
if cache.build != null {
mounts: buildCache: {
id: "\(app.name)_build_\(env)"
concurrency: cache.build
dest: "\(mounts.app.dest)/_build/\(env)"