Agent images
Agent images let you define custom Dockerfile bodies for Buildkite hosted agents. Each agent image is associated with a cluster and is built on top of a Buildkite-managed base image.
This API is available to organizations with Buildkite hosted agents enabled. If Buildkite hosted agents are not enabled for your organization, every endpoint returns 404 Not Found. When they are enabled but the target cluster is not a hosted cluster, list requests return an empty list, get and delete requests return 404 Not Found, and create requests return 422 Unprocessable Entity.
Agent image data model
id |
ID of the agent image (the Namespace profile ID) |
|---|---|
name |
Name of the agent image |
status |
Build status of the agent image. Possible values: BUILDING, READY, FAILED
|
image_ref |
The fully qualified image URL once the agent image has been built. null while the image is still building |
version |
Version number of the agent image |
last_build_error |
Error message from the most recent failed build, or null if no error |
dockerfile |
The user-supplied Dockerfile body (without the FROM instruction). This is the content you would submit in a create request |
base_image |
The Buildkite-managed base image FROM line prepended to every agent image Dockerfile |
composed_dockerfile |
The full Dockerfile sent to the image builder: base_image followed by dockerfile
|
url |
Canonical API URL of the agent image |
web_url |
URL of the agent image on Buildkite |
cluster_url |
API URL of the cluster the agent image belongs to |
List agent images
Returns the list of a cluster's agent images, sorted alphabetically by name. Non-hosted clusters return an empty list.
curl -H "Authorization: Bearer $TOKEN" \
-X GET "https://api.buildkite.com/v2/organizations/{org.slug}/clusters/{cluster.id}/agent-images"
[
{
"id": "abc123def4567",
"name": "my-custom-image",
"status": "READY",
"image_ref": "registry.example.com/your-org/buildkite/abc123def4567:v1",
"version": 1,
"last_build_error": null,
"dockerfile": "RUN apt-get update && apt-get install -y curl",
"base_image": "FROM docker.io/buildkite/hosted-agent-base:ubuntu-v1.0.1@sha256:f1378abd34fccb2b7b661aaf3b06394509a4f7b5bb8c2f8ad431e7eaa1cabc9c",
"composed_dockerfile": "FROM docker.io/buildkite/hosted-agent-base:ubuntu-v1.0.1@sha256:f1378abd34fccb2b7b661aaf3b06394509a4f7b5bb8c2f8ad431e7eaa1cabc9c\nRUN apt-get update && apt-get install -y curl",
"url": "https://api.buildkite.com/v2/organizations/acme-inc/clusters/42f1a7da-812d-4430-93d8-1cc7c33a6bcf/agent-images/abc123def4567",
"web_url": "https://buildkite.com/organizations/acme-inc/clusters/42f1a7da-812d-4430-93d8-1cc7c33a6bcf/agent_images/abc123def4567",
"cluster_url": "https://api.buildkite.com/v2/organizations/acme-inc/clusters/42f1a7da-812d-4430-93d8-1cc7c33a6bcf"
}
]
Required scope: read_clusters
Success response: 200 OK
Get an agent image
curl -H "Authorization: Bearer $TOKEN" \
-X GET "https://api.buildkite.com/v2/organizations/{org.slug}/clusters/{cluster.id}/agent-images/{id}"
{
"id": "abc123def4567",
"name": "my-custom-image",
"status": "READY",
"image_ref": "registry.example.com/your-org/buildkite/abc123def4567:v1",
"version": 1,
"last_build_error": null,
"dockerfile": "RUN apt-get update && apt-get install -y curl",
"base_image": "FROM docker.io/buildkite/hosted-agent-base:ubuntu-v1.0.1@sha256:f1378abd34fccb2b7b661aaf3b06394509a4f7b5bb8c2f8ad431e7eaa1cabc9c",
"composed_dockerfile": "FROM docker.io/buildkite/hosted-agent-base:ubuntu-v1.0.1@sha256:f1378abd34fccb2b7b661aaf3b06394509a4f7b5bb8c2f8ad431e7eaa1cabc9c\nRUN apt-get update && apt-get install -y curl",
"url": "https://api.buildkite.com/v2/organizations/acme-inc/clusters/42f1a7da-812d-4430-93d8-1cc7c33a6bcf/agent-images/abc123def4567",
"web_url": "https://buildkite.com/organizations/acme-inc/clusters/42f1a7da-812d-4430-93d8-1cc7c33a6bcf/agent_images/abc123def4567",
"cluster_url": "https://api.buildkite.com/v2/organizations/acme-inc/clusters/42f1a7da-812d-4430-93d8-1cc7c33a6bcf"
}
Required scope: read_clusters
Success response: 200 OK
Create an agent image
Buildkite manages the base image for all hosted agent images. Submit only the Dockerfile body — the instructions to layer on top of the base image. Do not include a FROM instruction; Buildkite prepends the managed base image automatically.
Image builds are asynchronous. The response returns immediately with status: "BUILDING". Poll get an agent image until status is READY or FAILED.
curl -H "Authorization: Bearer $TOKEN" \
-X POST "https://api.buildkite.com/v2/organizations/{org.slug}/clusters/{cluster.id}/agent-images" \
-H "Content-Type: application/json" \
-d '{ "name": "my-custom-image", "dockerfile": "RUN apt-get update && apt-get install -y curl" }'
{
"id": "abc123def4567",
"name": "my-custom-image",
"status": "BUILDING",
"image_ref": null,
"version": 1,
"last_build_error": null,
"dockerfile": "RUN apt-get update && apt-get install -y curl",
"base_image": "FROM docker.io/buildkite/hosted-agent-base:ubuntu-v1.0.1@sha256:f1378abd34fccb2b7b661aaf3b06394509a4f7b5bb8c2f8ad431e7eaa1cabc9c",
"composed_dockerfile": "FROM docker.io/buildkite/hosted-agent-base:ubuntu-v1.0.1@sha256:f1378abd34fccb2b7b661aaf3b06394509a4f7b5bb8c2f8ad431e7eaa1cabc9c\nRUN apt-get update && apt-get install -y curl",
"url": "https://api.buildkite.com/v2/organizations/acme-inc/clusters/42f1a7da-812d-4430-93d8-1cc7c33a6bcf/agent-images/abc123def4567",
"web_url": "https://buildkite.com/organizations/acme-inc/clusters/42f1a7da-812d-4430-93d8-1cc7c33a6bcf/agent_images/abc123def4567",
"cluster_url": "https://api.buildkite.com/v2/organizations/acme-inc/clusters/42f1a7da-812d-4430-93d8-1cc7c33a6bcf"
}
Required request body properties:
name |
Name for the agent image. Must be unique within the cluster. Example: "my-custom-image"
|
|---|---|
dockerfile |
Dockerfile body to layer on top of the Buildkite-managed base image. Must be a string and must not contain a FROM instruction. Pass an empty string ("") to build an image with no additional layers.Example: "RUN apt-get update && apt-get install -y curl"
|
Required scope: write_clusters
Success response: 201 Created
Error responses:
409 Conflict |
{ "message": "an agent image named \"my-custom-image\" already exists in this cluster" } |
|---|---|
422 Unprocessable Entity |
{ "message": "Reason for failure" } |
Delete an agent image
Deleting an agent image that is currently assigned to one or more queues returns 409 Conflict. Reassign those queues to a different agent image before deleting.
curl -H "Authorization: Bearer $TOKEN" \
-X DELETE "https://api.buildkite.com/v2/organizations/{org.slug}/clusters/{cluster.id}/agent-images/{id}"
Required scope: write_clusters
Success response: 204 No Content
Error responses:
404 Not Found |
{ "message": "No agent image found with the given ID." } |
|---|---|
409 Conflict |
{ "message": "this agent image is in use by one or more queues; reassign those queues before deleting it" } |