Skip to main content
Version: v3.9.0

Engines

Edgelet routes all container operations through the ContainerEngine interface (pkg/engine). The internal/engines package is the factory that constructs the correct implementation from containerEngine config. Platform build tags determine which engines are linked.

Code: internal/engines/, implementations in pkg/engine/{edgelet,docker,podman}/

Operator guide: Container engines

Purpose​

  • Select engine at runtime: edgelet, docker, or podman
  • Apply consistent EngineConfig (socket URL, API version, log dir)
  • Wrap external engines with structured debug logging
  • Warn when Docker/Podman sockets exist alongside containerEngine=edgelet

Dependencies​

Depends onReason
configcontainerEngine, containerEngineUrl
pkg/engine/*Concrete engine implementations
Used byReason
supervisorCreates engine before Process Manager start
processmanagerAll container CRUD
pruningImage prune delegation
healthcheckExec-based checks (edgelet engine)
runtimeapiImage pull/list/load

Factory behavior​

Linux (factory_linux.go)​

containerEngineImplementation
edgeletpkg/engine/edgelet: embedded containerd + CNI + DNS
dockerpkg/engine/docker
podmanpkg/engine/podman

NewContainerEngine(type, cfg) returns (ContainerEngine, error).

WrapWithLoggingIfExternal() adds API call logging for docker/podman only.

Desktop (factory_desktop.go)​

Only docker and podman. No embedded edgelet engine.

Edgelet engine specifics​

When containerEngine=edgelet:

  • Uses isolated paths: /var/lib/edgelet-containerd/, /run/edgelet/containerd.sock
  • Embedded containerd started in bootstrap before Supervisor (not by Supervisor)
  • Integrates dnsresolver, RuntimeClass shims, pause image, CNI
  • Supports HealthcheckEngine exec path

warnIfExternalRuntimePresent() logs if host Docker/Podman sockets are visible (informational; no interference).

External engine degraded mode​

Supervisor retries docker/podman init; if socket unavailable:

  • Daemon continues in WARNING state
  • Background recovery goroutine retries until engine connects
  • Process Manager reconcile may quiesce during engine switch

Configuration​

KeyEffect
containerEngineFactory selector
containerEngineUrlSocket/endpoint for external engines
dockerApiVersionDocker API version string
logDirectoryContainer log root passed to edgelet engine

Interface surface​

Key ContainerEngine operations (see pkg/engine/engine.go):

  • Init, PullImage, CreateContainer, Start, Stop, Remove
  • ListContainers, Inspect, Logs, Exec
  • PruneImages (used by pruning manager)

Observability​

  • Factory log module: "ContainerEngine"
  • Engine name recorded in runtime.GetState() at startup
  • External engine API logs via LoggingEngine wrapper

Failure modes​

SymptomTypical cause
Start failure on linux edgeletContainerd not prestarted
WARNING daemonDocker/Podman socket down
Wrong network/DNSEngine mismatch vs config reload
Crash looks empty on docker/podmanInspect must include exitCode= / oomKilled= / error= when not healthily running; embedded engine keeps CRI reason=...

Code map​

FileRole
factory_linux.goLinux engine construction
factory_desktop.goDesktop engine construction
factory_common.goShared warnings

Implementations: pkg/engine/edgelet/, pkg/engine/docker/, pkg/engine/podman/.

Related: Supervisor, Process manager, DNS resolver, Health check, Engine lifecycle.

Group 3See anything wrong with the document? Help us improve it!