FROM ghcr.io/spiffe/spire-agent:1.15.3@sha256:41b0dcd8b258a69db9e2768292a060766fb76fd866e4bc925849981ea1b825ff AS spire FROM docker.io/gitea/runner:3.5.0@sha256:66b7da94dc7dcadb2e076bec6928221336a9a637196399281c4b766fe1288242 AS runner FROM docker.io/library/golang:1.27-alpine@sha256:4cb7ac979db5fcc41cae44b2227ba5ab8a51e8807f40d9ba4dee20a0ad960b5b AS controller WORKDIR /src COPY go.mod go.sum ./ RUN go mod download COPY cmd ./cmd COPY internal ./internal RUN CGO_ENABLED=0 go build -trimpath -ldflags='-s -w' -o /out/gitea-dynamic-runner ./cmd/gitea-dynamic-runner # The runner daemon image is intentionally minimal and does not contain the # Node.js runtime required by JavaScript actions such as actions/checkout. # Run the daemon in Gitea's Ubuntu workflow image so host-mode jobs and their # actions share a GitHub Actions-compatible userspace. FROM docker.io/gitea/runner-images:ubuntu-latest@sha256:fd911d7417bfbf0f454530e447da95b58001e1df41bbc5e1a8dd35d432575aae USER root RUN groupadd --gid 2000 runner \ && useradd --uid 2000 --gid 2000 --groups docker --create-home --shell /bin/bash runner \ && printf 'runner ALL=(ALL) NOPASSWD:ALL\n' >/etc/sudoers.d/runner \ && chmod 0440 /etc/sudoers.d/runner \ && install -d -o 2000 -g 2000 /data /workspace COPY --from=runner /usr/local/bin/gitea-runner /usr/local/bin/gitea-runner COPY --from=controller /out/gitea-dynamic-runner /usr/local/bin/gitea-dynamic-runner COPY --from=spire /opt/spire/bin/spire-agent /opt/spire/bin/spire-agent COPY config/runner.yaml /etc/gitea-runner/config.yaml COPY --chmod=0755 scripts/gitea-job-started /usr/local/libexec/gitea-job-started COPY --chmod=0755 scripts/gitea-opensandbox-runner /usr/local/libexec/gitea-opensandbox-runner COPY --chmod=0755 scripts/setup-job-docker /usr/local/libexec/setup-job-docker VOLUME ["/data"] ENV HOME=/home/runner USER 2000:2000 WORKDIR /home/runner ENTRYPOINT ["/usr/local/bin/gitea-dynamic-runner"] CMD ["executor"]