Troubleshoot container and version availability
When a container or version isn't available to you: how to identify which situation you're in, what to do about each, …
For the complete documentation index, see llms.txt.
Dependabot is GitHub’s dependency update tool. It reads the container image references in your Dockerfiles and Kubernetes manifests, checks the registry for newer tags, and opens pull requests to update them.
This guide explains how to configure Dependabot to authenticate to your organization’s private registry at cgr.dev so it can keep your references to Chainguard Containers current.
Dependabot and Digestabot solve different halves of the same problem, and many teams run both:
go:1.22 to go:1.26. Use it to move between version streams.latest or 3.14 changes often. Use Digestabot to pick up those rebuilds.Dependabot acts on the tag string in your reference. If you pin to a mutable tag and never change that string, Dependabot has nothing to update, and Digestabot is the better fit.
To follow this guide, you need:
chainctl installed on your local machine. Refer to How to install chainctl if you haven’t set this up.Dependabot authenticates to private container registries with a static username and password. It doesn’t support Chainguard assumable identities, so you need to create a pull token.
Create one with chainctl:
chainctl auth configure-docker --pull-token --ttl 2160hThis command responds with output such as the following:
To use this pull token in another environment, run this command:
docker login "cgr.dev" --username "<USERNAME>" --password "<PASSWORD>"The username has the form <organization ID>/<pull token ID>. Record both values; you’ll store them as secrets in the next section.
The --ttl flag sets how long the token stays valid. The example uses 2160h, or 90 days. The default is 720h (30 days) and the maximum is 8760h (one year). Dependabot’s authentication fails once the token expires, so choose a lifetime you can commit to rotating, and set a reminder to replace the token before it lapses.
One pull token can serve every repository in your GitHub organization. Storing it as an organization-level secret, rather than creating a token for each repository, leaves you with a single credential to rotate.
GitHub keeps Dependabot secrets in a separate store from Actions secrets. A token added to Actions secrets is invisible to Dependabot, and the update job fails to authenticate without a clear explanation.
To add the secrets to a single repository:
CHAINGUARD_PULL_TOKEN_USERNAME and enter the username from the previous section.CHAINGUARD_PULL_TOKEN_PASSWORD with the password value.To share one token across every repository in your GitHub organization, add the secrets at Settings > Secrets and variables > Dependabot in the organization’s settings instead, and grant access to the repositories that need them.
Create a file named .github/dependabot.yml at the root of your repository with the following content:
version: 2
registries:
chainguard:
type: docker-registry
url: cgr.dev
username: ${{secrets.CHAINGUARD_PULL_TOKEN_USERNAME}}
password: ${{secrets.CHAINGUARD_PULL_TOKEN_PASSWORD}}
replaces-base: true
updates:
- package-ecosystem: "docker"
directory: "/"
registries:
- chainguard
schedule:
interval: "daily"This configuration defines a registry named chainguard, points it at cgr.dev, and authenticates with the secrets you created. The updates section tells Dependabot to check the Dockerfiles in the repository root once a day, using that registry.
Adjust directory to match where your manifests live, and interval to match how often you want pull requests. Refer to GitHub’s Dependabot options reference for the full set of options.
Commit this file to your repository’s default branch.
replaces-base
Setting replaces-base: true tells Dependabot to resolve container image references against cgr.dev instead of Docker Hub, the default registry for the Docker ecosystem.
This setting doesn’t affect fully qualified references such as cgr.dev/example.com/go:1.22, which Dependabot matches by hostname either way. It changes how Dependabot resolves unqualified references such as FROM python:3.13, which it sends to cgr.dev rather than Docker Hub.
Keep replaces-base: true when every container image in the repository comes from Chainguard. If the repository also pulls images from other registries, omit the setting so Dependabot resolves each reference against the registry that hosts it:
registries:
chainguard:
type: docker-registry
url: cgr.dev
username: ${{secrets.CHAINGUARD_PULL_TOKEN_USERNAME}}
password: ${{secrets.CHAINGUARD_PULL_TOKEN_PASSWORD}}replaces-base keeps Dependabot working across a mix of registries, but the images it resolves elsewhere remain outside Chainguard’s hardening and rebuild process. Container images from other registries are not covered by Chainguard’s CVE SLA. Where a Chainguard equivalent exists, replacing those references and keeping replaces-base: true gives you broader coverage.Dependabot runs on the schedule you set, but you can trigger a run immediately to confirm that authentication works:
docker ecosystem.Select Last checked to open the job log. A successful run lists the tags Dependabot found for each image, then opens a pull request for any reference it can update, with a title such as Bump example.com/go from 1.22 to 1.26.
Chainguard recommends pinning image references to a digest while keeping the tag as a version hint, in the form cgr.dev/example.com/go:1.22@sha256:.... Dependabot updates both parts of a reference that’s already in this form, as described in Unique tags.
Two limits are worth knowing before you rely on this:
private_source_authentication_failure
This error means Dependabot reached cgr.dev but couldn’t authenticate. Check the following, in order:
chainctl auth pull-token list to see the tokens in your organization and when they expire.<organization ID>/<pull token ID> string, including the slash.docker login cgr.dev --username <USERNAME> --password <PASSWORD>, followed by a docker pull of one of the images in your repository.If the job log shows a successful run but no pull requests, check the following:
latest produces no pull requests, because the tag never changes. Use Digestabot for those references.open-pull-requests-limit option if existing pull requests are holding the queue.FROM python:3.13 reach cgr.dev only when replaces-base: true is set. Otherwise, fully qualify the reference.Last updated: 2026-09-03 15:15