Prerequisites
Required#
| Dependency | Purpose |
|---|---|
| Docker or Podman | Runs the gitlab-runner image, mock server, and CI job containers |
| Git | Remote URL detection, branch/commit info |
glci drives Docker by default, and also supports Podman as a drop-in container engine. Set the engine explicitly with [docker] engine = "podman" in ~/.glci/config.toml — this is a global setting and is ignored in a project .glciconfig.toml. When the engine is unset, glci uses Docker if reachable and otherwise falls back to Podman. See Configuration > Config files.
Podman must be exposing its Docker-compatible API socket (glci mounts it into runner containers). Start it with systemctl --user enable --now podman.socket (rootless), sudo systemctl enable --now podman.socket (rootful), or podman machine start (macOS/Windows). Run glci doctor to verify both the engine and its API socket.
On macOS and Windows Podman runs inside a VM, so the API socket lives inside that VM and cannot be dialed from the host: glci doctor reports the socket as “cannot verify from host”, which is expected and does not fail the check. glci picks up the machine’s ssh:// endpoint from podman system connection list (exporting CONTAINER_HOST and CONTAINER_SSHKEY) and mounts the socket path that connection reports. Use podman machine list to confirm the machine is running.
The same applies on Linux when the resolved Podman endpoint is not a local unix:// path — CONTAINER_HOST, or failing that the default podman system connection, pointing at ssh:// or tcp://. The socket is on the far side, so doctor reports “cannot verify from host” rather than failing a perfectly healthy remote Podman.
No gitlab-runner binary is needed on the host – glci runs the official gitlab/gitlab-runner Docker image automatically.
Optional#
| Dependency | When needed |
|---|---|
| Go 1.25+ | Building from source or bleeding-edge install |
| glab CLI | Easiest way to provide a GitLab token (remote includes, CI/CD variables, cross-project triggers) |
| make | Building from source |
GitLab token#
A token is needed for include: project:, include: component:, CI/CD variables, and cross-project triggers. Token resolution order:
--tokenflagGITLAB_TOKENorGITLAB_PRIVATE_TOKENenvironment variable[gitlab] tokenin.glciconfig.toml/~/.glci/config.tomlglab auth credential-helper(if glab is installed and authenticated viaglab auth login) – supports keyring, OAuth2 refresh, and PAT/CI tokens- Direct read of
~/.config/glab-cli/config.yml– legacy fallback
Verify your token source with glci config --gitlab.
If the instance URL comes from a project .glciconfig.toml, only --token and a [gitlab] token in that same project file are used — glci does not send environment, glab, or ~/.glci/config.toml credentials to a host the repository chose. See [gitlab] url in a project config.
Platform support#
| Platform | Container runtime | Status |
|---|---|---|
| macOS | Colima | Recommended, fully tested |
| macOS | Docker Desktop | Works, not regularly tested |
| macOS | Podman (podman machine) | Works |
| Windows | Podman (podman machine) | Build from source only (go build ./cmd/glci) – no prebuilt binary is published and install.sh does not support it |
| Linux | Docker Engine | Works out of the box |
| Linux | Podman (rootless or rootful) | Works; requires the API socket running |
On macOS, Colima (colima start) is recommended. It exposes the Docker socket at the default location with no extra configuration. For Podman on macOS or Windows, run podman machine start; the default machine (rootless inside the VM) is supported as-is. Pipelines that need Docker-in-Docker still want a rootful machine — see Troubleshooting > Podman.
On Linux, ensure your user is in the docker group (or use rootless Docker). For Podman, enable its API socket (systemctl --user enable --now podman.socket for rootless, sudo systemctl enable --now podman.socket for rootful).
Port requirements#
glci publishes the mock server on port 39741 (default) of the Docker host. This port must be available (not used by another process) on every Docker host where glci runs. CI job containers reach the mock server through this port via Docker’s host-gateway mechanism.
The port is configurable via mock_server_port in ~/.glci/config.toml:
[network]
mock_server_port = 39741 # default
Note: Changing this port requires a full daemon restart (
glci daemon stop && glci daemon start). A running daemon will continue using the port it started with.
If the port is already in use, glci will fail to start the mock server. See Troubleshooting > Port conflicts for diagnosis steps.
Remote Docker daemons#
Remote Docker daemons (DOCKER_HOST=tcp://..., Docker contexts, cloud-hosted Docker) are supported. glci detects the endpoint in this order:
[docker] hostin~/.glci/config.tomlDOCKER_HOSTenvironment variable- Active Docker context (
docker context useorDOCKER_CONTEXT) - Default Docker socket
For remote daemons, glci uses a docker exec transport instead of bind mounts, so no shared filesystem is required between the glci host and the Docker daemon.
[docker]
host = "tcp://remote-host:2375" # or "ssh://remote-host"
Or per shell, without touching the config — an exported DOCKER_HOST beats the active context, just as it does for the docker CLI:
DOCKER_HOST=tcp://remote-host:2375 glci run
The daemon resolves the endpoint once at startup and is shared by every project, so switching endpoints needs glci daemon stop (it re-starts on the next command). glci warns when your shell selects an endpoint the running daemon is not using rather than restarting it behind your back — see Endpoint changes and the shared daemon. glci daemon status reports the endpoint currently in use and where it came from.
Note: Use
glci system pruneinstead ofdocker system pruneon shared remote hosts – it only cleans glci-specific resources.