Skip to main content

Jobs

Jobs are containers that perform one-off or scheduled tasks to support the application. Jobs are defined in their own top-level jobs section of the Acornfile. A job container will continue to run until it has successfully completed all operations once.

A Job has all the same fields as a container, with the exception of an optional schedule and events field.

Scheduled jobs

Jobs that need to be run on a schedule, like a backup job, must also define the schedule field.

jobs: {
"db-backup": {
image: "registry.io/myorg/db-backup"
env: {
"BACKUP_USER": "secret://backup-user-creds/username"
"BACKUP_PASS": "secret://backup-user-creds/password"
}
command: ["/scripts/backup"]
schedule: "@hourly"
}
}

The schedule key makes this a cron based job. The schedule field must be a valid crontab format entry. Meaning it can use standard * * * * * format or @[interval] crontab shorthand.

Events

Acorn supports four events that can trigger a job to run: create, update, stop, and delete. By default jobs will run on create and update. To change this behavior, use the events field.

Even with event subscriptions, assume the job will run at least once. The job should be idempotent, and also detect the expected event is infact being processed.

The create event will run the job when the app is created, or when the job is first added to the Acornfile.

The update event will run the job when the app is updated or started from stop.

The stop event will run the job when the app is stopped.

The delete event will run the job when the app is deleted. The job will run, and must complete successfully, before the remaining containers are deleted in that Acorn app. If the job fails, the app will not be deleted. To skip the job, use the --ignore-cleanup flag.

jobs: {
"cluster-reconcile": {
image: "registry.io/myorg/cluster-manager"
env: {
"CLUSTER_PASS": "secret://cluster-auth-token/token"
}
events: ["create", "update", "stop", "delete"]
entrypoint: ["/lc.sh"]
files: {
"/lc.sh": """
#!/bin/sh
if if [ "${ACORN_EVENT}" = "create" ]; then
echo "Create event"
exit 0
elif [ "${ACORN_EVENT}" = "update" ]; then
echo "Update event"
exit 0
elif [ "${ACORN_EVENT}" = "stop" ]; then
echo "Stop event"
exit 0
elif [ "${ACORN_EVENT}" = "delete" ]; then
echo "Delete event"
exit 0
else
echo "Unknown event"
exit 1
fi
"""
}
}
}

Network ports

Like containers, jobs may also define ports. Job ports are only accessible while the job is running. Similarly, any endpoints generated for publish ports defined by a job will only exist while the job is running.

jobs: {
"cluster-reconcile-hook": {
image: "registry.io/myorg/cluster-manager-hook"
ports: publish: "8080/http"
entrypoint: ["/hook.sh"]
}
}