actions / actions/actions-runner-controller

Can I use a locally built image for the runner? It keeps trying to pull the image from the registry

Open
#3,513 7 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

community enhancement needs triage
Dominant language
Go
Stars
6.5k
Forks
1.5k
Avg merge
2d 2h
Merged PRs (30d)
27

Description

What would you like added?

A clear and concise description of what you want to happen.

I want to use my custom image which i built locally. I've checked that the image exists locally using docker ps and I tried to override the imagePullPolicy in the runner-scale-set/values.yaml to Never. But it's still trying to pull images from the registry.

tail values.yaml -n 20
  ##               storageClassName: "local-path"
  ##               resources:
  ##                 requests:
  ##                   storage: 1Gi
  spec:
    containers:
      - name: runner
        imagePullPolicy: Never
        image: github-runner:latest
        command: ["/home/runner/run.sh"]

## Optional controller service account that needs to have required Role and RoleBinding
## to operate this gha-runner-scale-set installation.
## The helm chart will try to find the controller deployment and its service account at installation time.
## In case the helm chart can't find the right service account, you can explicitly pass in the following value
## to help it finish RoleBinding with the right service account.
## Note: if your controller is installed to only watch a single namespace, you have to pass these values explicitly.
# controllerServiceAccount:
#   namespace: arc-system
#   name: test-arc-gha-runner-scale-set-controller
docker images
REPOSITORY                                        TAG        IMAGE ID       CREATED         SIZE
github-runner                                     latest     ee0e556e28ce   25 hours ago    1.89GB
docker                                            dind       1feaad25659a   3 days ago      365MB
ghcr.io/actions/actions-runner                    latest     9f541e249fd4   10 days ago     1.14GB
registry.k8s.io/kube-apiserver                    v1.30.0    c42f13656d0b   3 weeks ago     117MB
registry.k8s.io/kube-controller-manager           v1.30.0    c7aad43836fa   3 weeks ago     111MB
registry.k8s.io/kube-scheduler                    v1.30.0    259c8277fcbb   3 weeks ago     62MB
registry.k8s.io/kube-proxy                        v1.30.0    a0bf559e280c   3 weeks ago     84.7MB
ghcr.io/actions/gha-runner-scale-set-controller   0.9.1      9ffa9943ca6b   3 weeks ago     199MB
registry.k8s.io/etcd                              3.5.12-0   3861cfcd7c04   3 months ago    149MB
registry.k8s.io/coredns/coredns                   v1.11.1    cbb01a7bd410   9 months ago    59.8MB
registry.k8s.io/pause                             3.9        e6f181688397   19 months ago   744kB
gcr.io/k8s-minikube/storage-provisioner           v5         6e38f40d628d   3 years ago     31.5MB
kubectl -n arc-runners get pods
NAME                                           READY   STATUS                  RESTARTS   AGE
self-hosted-x64-linux-api-nz55j-runner-2lms2   0/2     Init:ImagePullBackOff   0          18s
self-hosted-x64-linux-api-nz55j-runner-ws72n   0/2     Init:ImagePullBackOff   0          18s
kubectl -n arc-runners describe pod self-hosted-x64-linux-api-nz55j-runner-2lms2 | tail -n 20
    SizeLimit:  <unset>
  kube-api-access-ntn9m:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age                  From               Message
  ----     ------     ----                 ----               -------
  Normal   Scheduled  2m47s                default-scheduler  Successfully assigned arc-runners/self-hosted-x64-linux-api-nz55j-runner-2lms2 to arc
  Normal   Pulling    78s (x4 over 2m46s)  kubelet            Pulling image "github-runner:latest"
  Warning  Failed     78s (x4 over 2m46s)  kubelet            Failed to pull image "github-runner:latest": Error response from daemon: pull access denied for github-runner, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed     78s (x4 over 2m46s)  kubelet            Error: ErrImagePull
  Warning  Failed     67s (x6 over 2m46s)  kubelet            Error: ImagePullBackOff
  Normal   BackOff    52s (x7 over 2m46s)  kubelet            Back-off pulling image "github-runner:latest"

Note: Feature requests to integrate vendor specific cloud tools (e.g. awscli, gcloud-sdk, azure-cli) will likely be rejected as the Runner image aims to be vendor agnostic.

Why is this needed?

A clear and concise description of any alternative solutions or features you've considered.

Additional context

Add any other context or screenshots about the feature request here.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with runner-scale-set/values.yaml and the generated runner pod specification, then inspect the pod events from kubectl describe to trace where imagePullPolicy is applied. Done means a locally built github-runner:latest image can be used by the runner without attempting a registry pull, with the relevant configuration behavior documented or tested.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, github-actions, helm, kubernetes
Domain
ci-cd, devops, infrastructure
Issue type
Feature
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.