Lightweight CI/CD pipeline server with a built-in agent — integrates with Gitea, GitHub, and GitLab for automated builds and deployments.
| Port | 8000 |
| Registry | ghcr.io/daemonless/woodpecker |
| Source | https://github.com/woodpecker-ci/woodpecker |
| Website | https://woodpecker-ci.org/ |
| Tag | Description | Best For |
|---|---|---|
latest |
Upstream Binary. Built from official release. | Most users. Matches Linux Docker behavior. |
Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions.
services:
woodpecker:
image: ghcr.io/daemonless/woodpecker:latest
container_name: woodpecker
environment:
- WOODPECKER_SERVER_ENABLE=true
- WOODPECKER_DATABASE_DRIVER=sqlite3
- WOODPECKER_DATABASE_DATASOURCE=/config/woodpecker.sqlite
- WOODPECKER_AGENT_SECRET=agent-secret
- PUID=1000
- PGID=1000
- TZ=UTC
volumes:
- "/path/to/containers/woodpecker:/config"
ports:
- 8000:8000
- 9000:9000
restart: unless-stopped.env:
DIRECTOR_PROJECT=woodpecker
WOODPECKER_SERVER_ENABLE=true
WOODPECKER_DATABASE_DRIVER=sqlite3
WOODPECKER_DATABASE_DATASOURCE=/config/woodpecker.sqlite
WOODPECKER_AGENT_SECRET=agent-secret
PUID=1000
PGID=1000
TZ=UTC
appjail-director.yml:
options:
- virtualnet: ':<random> default'
- nat:
services:
woodpecker:
name: woodpecker
options:
- container: 'boot args:--pull'
oci:
user: root
environment:
- WOODPECKER_SERVER_ENABLE: !ENV '${WOODPECKER_SERVER_ENABLE}'
- WOODPECKER_DATABASE_DRIVER: !ENV '${WOODPECKER_DATABASE_DRIVER}'
- WOODPECKER_DATABASE_DATASOURCE: !ENV '${WOODPECKER_DATABASE_DATASOURCE}'
- WOODPECKER_AGENT_SECRET: !ENV '${WOODPECKER_AGENT_SECRET}'
- PUID: !ENV '${PUID}'
- PGID: !ENV '${PGID}'
- TZ: !ENV '${TZ}'
volumes:
- woodpecker: /config
volumes:
woodpecker:
device: '/path/to/containers/woodpecker'Makejail:
ARG tag=latest
OPTION overwrite=force
OPTION from=ghcr.io/daemonless/woodpecker:${tag}
podman run -d --name woodpecker \
-p 8000:8000 \
-p 9000:9000 \
-e WOODPECKER_SERVER_ENABLE=true \
-e WOODPECKER_DATABASE_DRIVER=sqlite3 \
-e WOODPECKER_DATABASE_DATASOURCE=/config/woodpecker.sqlite \
-e WOODPECKER_AGENT_SECRET=agent-secret \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=UTC \
-v /path/to/containers/woodpecker:/config \
ghcr.io/daemonless/woodpecker:latest- name: Deploy woodpecker
containers.podman.podman_container:
name: woodpecker
image: ghcr.io/daemonless/woodpecker:latest
state: started
restart_policy: always
env:
WOODPECKER_SERVER_ENABLE: "true"
WOODPECKER_DATABASE_DRIVER: "sqlite3"
WOODPECKER_DATABASE_DATASOURCE: "/config/woodpecker.sqlite"
WOODPECKER_AGENT_SECRET: "agent-secret"
PUID: "1000"
PGID: "1000"
TZ: "UTC"
ports:
- "8000:8000"
- "9000:9000"
volumes:
- "/path/to/containers/woodpecker:/config"Access at: http://localhost:8000
| Variable | Default | Description |
|---|---|---|
WOODPECKER_SERVER_ENABLE |
true |
Enable Woodpecker Server (true/false) |
WOODPECKER_DATABASE_DRIVER |
sqlite3 |
|
WOODPECKER_DATABASE_DATASOURCE |
/config/woodpecker.sqlite |
|
WOODPECKER_AGENT_SECRET |
agent-secret |
Shared secret for server-agent communication |
PUID |
1000 |
|
PGID |
1000 |
|
TZ |
UTC |
| Path | Description |
|---|---|
/config |
Data directory (database, logs) |
| Port | Protocol | Description |
|---|---|---|
8000 |
TCP | Server Web UI/API |
9000 |
TCP | GRPC (Server/Agent communication) |
Architectures: amd64
User: bsd (UID/GID via PUID/PGID, defaults to 1000:1000)
Base: FreeBSD 15.0
Need help? Join our Discord community.