semaphoreui/semaphore · error
docker executor is only available in the proprietary build
Error message
docker executor is only available in the proprietary build
What it means
In the open-source build of Semaphore, the Docker executor stub always returns this error. The real Docker executor implementation lives only in the proprietary build, so any attempt to instantiate a Docker executor provider from the OSS binary fails unconditionally.
Solutions
- Switch the runner's executor-type config to 'local', the only executor supported in the open-source build
- Obtain and deploy the proprietary Semaphore build, which contains the real Docker executor provider
- If the proprietary build is already installed, verify the correct binary/path is being launched (an OSS binary may still be on PATH)
Example fix
# before (config.yml) executor-type: docker # after (open-source build) executor-type: local
Defensive patterns
Strategy: validation
Validate before calling
if resolveExecutorType(executorCfg) == util.ExecutorTypeDocker {
return errors.New("docker executor requires the proprietary Semaphore build")
} Type guard
func isOSSBuild() bool { return buildFlavor == "oss" }
if isOSSBuild() && resolveExecutorType(cfg) == util.ExecutorTypeDocker { /* skip/reject */ } Prevention
- Only set executor-type: docker when running the proprietary build
- Document build-flavor requirements in your deployment config
- Validate runner config at deploy time
When it happens
Trigger: Calling pro/services/tasks/docker.NewProvider (via newExecutorProvider in services/runners/executor_factory.go) when resolveExecutorType(executorCfg) resolves to util.ExecutorTypeDocker — i.e. the runner's executor-type config is 'docker' and the binary is the open-source build.
Common situations: An operator configures `executor-type: docker` (or `kubernetes`/`docker` in the runner config) on a self-hosted open-source Semaphore install, unaware Docker execution requires the proprietary (EE) build.
Related errors
- k8s executor is only available in the proprietary build
- OIDC sign-in failed: invalid redirect URL.
- err
- name can not be empty
- missing secret
AI-assisted analysis of semaphoreui/semaphore@1774ccb71a (2026-09-07).
Data as JSON: /api/errors/6dd9dd2c5f1d0e30.
Report an issue: GitHub.
Appendix: source
Thrown at pro/services/tasks/docker/config.go:22
// in via the top-level go.work file (or the go.mod replace directive), the same import
// path resolves to a fully functional provider that runs each task in an ephemeral
// container. In the open-source build this stub keeps the executor_factory and job_pool
// imports compiling while making it explicit that the "docker" runner executor type
// requires the proprietary build.
//
// The only entry point is NewProvider; it always fails so JobPool refuses to start
// and the operator sees a clear message in the logs.
package docker
import (
"errors"
"github.com/semaphoreui/semaphore/services/tasks"
"github.com/semaphoreui/semaphore/util"
)
func NewProvider(_ util.RunnerDockerConfig) (tasks.ExecutorProvider, error) {
return nil, errors.New("docker executor is only available in the proprietary build")
}
View on GitHub (pinned to 1774ccb71a)