docker

package
v0.115.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 3, 2026 License: Apache-2.0 Imports: 76 Imported by: 0

Documentation

Index

Constants

View Source
const (
	ServiceMismatchReasonNotDeployed = "service not deployed"
	ServiceMismatchReasonUnnecessary = "service is unnecessary"
	ServiceMismatchReasonSwarmMode   = "swarm mode mismatch"
	ServiceMismatchReasonReplicas    = "replicas mismatch"
)
View Source
const (
	// ChangeTypeFailedDeployRetry marks a deployment retry after a recorded
	// failure. A Change of this type carries no service scope: the whole
	// project is force-recreated, because the failed part (e.g. a lifecycle
	// hook) is not attributable to one service.
	ChangeTypeFailedDeployRetry = "failed_deploy_retry"
)
View Source
const DefaultContextName = "default"
View Source
const (
	SocketPath = "/var/run/docker.sock"
)
View Source
const (

	// TestRemoteDockerImage is the Docker-in-Docker image version used in e2e tests.
	// Tracked by Renovate for automated updates .
	// Needs to be outside of test/ directory because Renovate ignores test/ by default.
	TestRemoteDockerImage = "docker:29-dind@sha256:3ef33f2e220b79ed3ef3b99d81746f06f306cd6340e2cb7331d17ae996e74cb6"
)

Variables

View Source
var (
	ErrNoContainerToStart = errors.New("no container to start")
	ErrIsInUse            = errors.New("is in use")
	ComposeVersion        string // Version of the docker compose module, will be set at runtime
)
View Source
var (
	ErrComposeScheduledMetadataUnavailable = errors.New("compose scheduled-job metadata unavailable")
	ErrComposeScheduledServiceReplicated   = errors.New("standalone scheduled compose service must have exactly one replica")
	// ErrComposeScheduledSourceUnavailable reports that a deployment source is not yet on disk.
	// This can occur before the first poll fetches it, so timer-based callers should retry rather
	// than treat it as a deployment failure.
	ErrComposeScheduledSourceUnavailable = errors.New("deployment source not available on disk")
)
View Source
var (
	ErrDockerContextNotFound = errors.New("docker context not found")
	ErrContextRegistryClosed = errors.New("docker context registry is closed")
)
View Source
var (
	ErrNotAJobService                = errors.New("service is not a job-mode service")
	ErrJobServiceRestartNotSupported = errors.New("restart not supported for job services")

	// ErrGlobalSwarmServiceNotScalable indicates a global/global-job service was
	// targeted by an operation that scales replicas, which Swarm does not allow.
	ErrGlobalSwarmServiceNotScalable = errors.New("global-mode swarm service cannot be scaled")
)
View Source
var (
	ErrMountPointNotFound     = errors.New("mount point not found")
	ErrMountPointNotWriteable = errors.New("mount point is not writeable")
	ErrContainerIDNotFound    = errors.New("container ID not found")
)
View Source
var (
	ErrDockerSocketConnectionFailed = errors.New("failed to connect to docker socket")
	ErrDockerHostConnectionFailed   = errors.New("failed to connect to docker host")
)
View Source
var DocoCDJobLabels = docoCDJobLabelNames

DocoCDJobLabels exposes the scheduler/job labels for consumers outside this package.

View Source
var DocoCDLabels = docoCdLabelNames{
	Metadata: docoCDLabelNamesMetadata{
		Manager: "cd.doco.metadata.manager",
		Version: "cd.doco.metadata.version",
	},
	Deployment: docoCdLabelNamesDeployment{
		Name:                 "cd.doco.deployment.name",
		Timestamp:            "cd.doco.deployment.timestamp",
		ComposeHash:          "cd.doco.deployment.compose.sha",
		WorkingDir:           "cd.doco.deployment.working_dir",
		ConfigTarget:         "cd.doco.deployment.config.target",
		TargetRef:            "cd.doco.deployment.target.ref",
		CommitSHA:            "cd.doco.deployment.target.sha",
		Trigger:              "cd.doco.deployment.trigger",
		ConfigHash:           "cd.doco.deployment.config.sha",
		AutoDiscovery:        "cd.doco.deployment.auto_discovery",
		AutoDiscoveryConfig:  "cd.doco.deployment.auto_discovery.config",
		Autostart:            "cd.doco.deployment.autostart",
		RecreateIgnore:       "cd.doco.deployment.recreate.ignore",
		RecreateIgnoreSignal: "cd.doco.deployment.recreate.ignore.signal",
		CertExpiry:           "cd.doco.deployment.cert.expiry",
		CertRotatable:        "cd.doco.deployment.cert.rotatable",
		CertState:            "cd.doco.deployment.cert.state",
	},
	Source: docoCdLabelNamesSource{
		Type: "cd.doco.source",
		Name: "cd.doco.source.name",
		URL:  "cd.doco.source.url",
	},
}

DocoCDLabels contains the label key names used by DocoCD to identify deployed containers and their metadata.

View Source
var ErrDeploymentModeConflict = errors.New("deployment mode migration conflicts with existing resources")

ErrDeploymentModeConflict means resources in the old deployment mode cannot safely be replaced because doco-cd cannot prove that it owns them.

View Source
var ErrIgnoreCfgInvalid = errors.New("ignore config is invalid")
View Source
var ErrNoSuchImage = errors.New("no such image") // Image does not exist
View Source
var ErrSwarmServiceAlreadyStopped = errors.New("swarm service is already scaled to 0 replicas")

ErrSwarmServiceAlreadyStopped indicates a replicated service was already scaled to 0 replicas, so there is nothing to stop or restore.

Functions

func CheckDefaultComposeFiles added in v0.73.0

func CheckDefaultComposeFiles(composeFiles []string, workingDir string) ([]string, error)

CheckDefaultComposeFiles checks if the default compose files are used and returns them if true.

func CheckMountPointWriteable added in v0.13.0

func CheckMountPointWriteable(mountPoint container.MountPoint) error

CheckMountPointWriteable checks if a mount point is writable by attempting to create a file in it.

func ClearDeploymentFailure added in v0.112.0

func ClearDeploymentFailure(repoName, stack string)

ClearDeploymentFailure removes the failure record of a stack, if present.

func ComposeSignal added in v0.77.0

func ComposeSignal(ctx context.Context, dockerCli command.Cli, project *types.Project, signal []SignalService) error

ComposeSignal will send signal to service.

func ConnectToSocketContext added in v0.114.0

func ConnectToSocketContext(ctx context.Context) (net.Conn, error)

ConnectToSocketContext connects to the Docker socket with context cancellation.

func CreateDockerCli

func CreateDockerCli(quiet bool) (command.Cli, error)

func CreateDockerCliWithContext added in v0.100.0

func CreateDockerCliWithContext(quiet bool, dockerContext string) (command.Cli, error)

func DecryptProjectFiles added in v0.74.0

func DecryptProjectFiles(repoPath string, p *types.Project) ([]string, error)

DecryptProjectFiles decrypts all files used in the compose project that are encrypted using doco-cd's encryption mechanism. This includes configs, secrets, bind mounts, env files and build contexts. Since absolute file paths in types.Project are paths on the docker host, repoPath also needs to be the external path to the repository. We use the symlink inside the container to follow the external path to the correct internal path.

func DeployStack added in v0.14.0

func DeployStack(ctx context.Context, req DeployRequest) error

DeployStack performs shared deployment lifecycle work and dispatches to the selected runtime.

func DeploySwarmStack added in v0.31.0

func DeploySwarmStack(ctx context.Context, dockerCli command.Cli, cfg *composetypes.Config, opts *options.Deploy) error

DeploySwarmStack deploys a Docker Swarm stack using the provided project and deploy configuration.

func DeployedServicesWithChangedImageDigests added in v0.110.0

func DeployedServicesWithChangedImageDigests(ctx context.Context, dockerCli command.Cli, swarmMode bool, project *types.Project, logger *slog.Logger) ([]string, error)

DeployedServicesWithChangedImageDigests returns the sorted names of deployed services whose image digest differs from the registry digest of the configured image ref.

This compares:

  1. deployed service image digest (currently running/deployed)
  2. registry digest of configured service image reference (DistributionInspect)

A service without a deployed digest is treated as changed.

func DeployedServicesWithChangedImageRefs added in v0.112.0

func DeployedServicesWithChangedImageRefs(ctx context.Context, dockerCli command.Cli, swarmMode bool, project *types.Project, logger *slog.Logger) ([]string, error)

DeployedServicesWithChangedImageRefs returns the sorted names of services whose configured image reference differs from the one currently deployed.

This is the tag-level counterpart of DeployedServicesWithChangedImageDigests. It answers "which services does this deployment move" for the ordinary case of a tag bump in the deploy config, where the digest comparison never runs because force_image_pull is off. It is local only, so it costs no registry lookups.

It deliberately under-reports rather than guess, because it feeds a notification and a wrong service name is worse than a missing one:

  • nothing deployed yet, i.e. the first deployment of this stack, yields no services; the stack level notification already says the whole stack came up
  • a service whose deployed reference cannot be determined is skipped

A service that is configured but has no deployed counterpart while other services do IS reported: it is genuinely arriving with this deployment.

func DestroyStack added in v0.14.0

func DestroyStack(
	jobLog *slog.Logger, ctx *context.Context,
	dockerCli *command.Cli, deployConfig *deploy.Config, swarmMode bool,
) error

DestroyStack destroys the stack using the provided deployment configuration.

func DisplayContextName added in v0.113.0

func DisplayContextName(name string) string

DisplayContextName returns the display name for the given context name. If the name is empty, it returns the default context name.

func Exec added in v0.13.0

func Exec(apiClient client.APIClient, containerID string, cmd ...string) (out string, err error)

func ExecContext added in v0.114.0

func ExecContext(ctx context.Context, apiClient client.APIClient, containerID string, cmd ...string) (out string, err error)

func ExtractOciArtifactTag added in v0.89.0

func ExtractOciArtifactTag(reference string) string

ExtractOciArtifactTag extracts the tag from OCI artifact references (e.g., "main" from "ghcr.io/kimdre/doco-cd_tests:main"). For Git references (e.g., "refs/heads/main", "feat/app/this", "v1.0.0-rc.1", "my/app"), it returns them as-is. For OCI artifact references with explicit tags, it returns the tag portion after the colon. For OCI artifact references with digests, it extracts the digest hash. If the reference has no tag or digest, it returns the original reference as-is (treated as Git reference).

func GetAutoDiscoveryServices added in v0.113.0

func GetAutoDiscoveryServices(ctx context.Context, cli client.APIClient, swarmMode bool) (map[Service]map[string]string, error)

GetAutoDiscoveryServices returns auto-discovered workloads and migrates legacy auto-discovery labels to the current representation. Swarm service labels can be updated in place; standalone containers persist the normalized labels during the deployment that follows reconciliation.

func GetContainerID added in v0.13.0

func GetContainerID(apiClient client.APIClient, name string) (id string, err error)

GetContainerID retrieves the container ID for a given service name.

func GetLabeledConfigs added in v0.31.0

func GetLabeledConfigs(ctx context.Context, cli client.APIClient, key, value string) (configs []swarm.Config, err error)

GetLabeledConfigs retrieves all configs with a specific label key and value.

func GetLabeledContainers added in v0.13.0

func GetLabeledContainers(ctx context.Context, cli client.APIClient, key, value string, all bool) (containers []container.Summary, err error)

GetLabeledContainers retrieves all containers with a specific label key and value.

func GetLabeledSecrets added in v0.31.0

func GetLabeledSecrets(ctx context.Context, cli client.APIClient, key, value string) (secrets []swarm.Secret, err error)

GetLabeledSecrets retrieves all secrets with a specific label key and value.

func GetLabeledServices added in v0.54.0

func GetLabeledServices(ctx context.Context, cli client.APIClient, swarmMode bool, key, value string) (map[Service]map[string]string, error)

GetLabeledServices retrieves all services with a specific label key and value, along with their labels.

func GetLabeledVolumes added in v0.31.0

func GetLabeledVolumes(ctx context.Context, cli client.APIClient, key, value string) (volumes []volume.Volume, err error)

GetLabeledVolumes retrieves all volumes with a specific label key and value.

func GetMountPointByDestination added in v0.13.0

func GetMountPointByDestination(cli client.APIClient, containerID, destination string) (container.MountPoint, error)

GetMountPointByDestination retrieves the mount point of a container volume/bind mount by its destination (mount point inside the container).

func GetPathsFromGitChangedFiles added in v0.77.0

func GetPathsFromGitChangedFiles(changedFiles []gitInternal.ChangedFile, basePath string) []string

func GetProjectContainers added in v0.55.0

func GetProjectContainers(ctx context.Context, dockerCli command.Cli, projectName string) ([]api.ContainerSummary, error)

GetProjectContainers returns the status of all services in the specified project.

func GetProjects added in v0.33.0

func GetProjects(ctx context.Context, dockerCli command.Cli, showDisabled bool) ([]api.Stack, error)

GetProjects returns a list of all projects.

func GetServiceLabels added in v0.54.0

func GetServiceLabels(ctx context.Context, cli client.APIClient, swarmMode bool, stackName string) (map[Service]Labels, error)

GetServiceLabels retrieves the Labels for each Service in a given stack.

func HasChangedBindMounts added in v0.29.0

func HasChangedBindMounts(repoPathExternal string, paths []string, project *types.Project, ignoreCfg projectIgnoreCfg) ([]string, []string)

HasChangedBindMounts checks if any files used in docker compose `volumes:` definitions with type `bind` have changed using the Git status.

func HasChangedBuildFiles added in v0.73.0

func HasChangedBuildFiles(repoPathExternal string, paths []string, project *types.Project, _ projectIgnoreCfg) ([]string, []string)

HasChangedBuildFiles checks if any files used as build context in docker compose `build:` definitions have changed using the Git status. This includes any file within the build context directory for each service. If a changed file is within a build context, it returns true.

func HasChangedConfigs added in v0.29.0

func HasChangedConfigs(repoPathExternal string, paths []string, project *types.Project, ignoreCfg projectIgnoreCfg) ([]string, []string)

HasChangedConfigs checks if any files used in docker compose `configs:` definitions have changed using the Git status.

func HasChangedEnvFiles added in v0.31.1

func HasChangedEnvFiles(repoPathExternal string, paths []string, project *types.Project, _ projectIgnoreCfg) ([]string, []string)

HasChangedEnvFiles checks if any files used in docker compose `env_file:` definitions have changed using the Git status.

func HasChangedSecrets added in v0.29.0

func HasChangedSecrets(repoPathExternal string, paths []string, project *types.Project, ignoreCfg projectIgnoreCfg) ([]string, []string)

HasChangedSecrets checks if any files used in docker compose `secrets:` definitions have changed using the Git status.

func InspectContainerState added in v0.115.0

func InspectContainerState(ctx context.Context, apiClient client.APIClient, containerID string) (*container.State, error)

InspectContainerState inspects the state of a specific container.

func ListManagedRepositoryContainers added in v0.115.0

func ListManagedRepositoryContainers(ctx context.Context, apiClient client.APIClient, repository string, all bool) ([]container.Summary, error)

ListManagedRepositoryContainers lists all containers that belong to a specific repository.

func ListManagedRepositoryServices added in v0.115.0

func ListManagedRepositoryServices(ctx context.Context, apiClient client.APIClient, repository string) ([]swarm.Service, error)

ListManagedRepositoryServices lists all services that belong to a specific repository.

func LoadCompose

func LoadCompose(ctx context.Context, dockerCli command.Cli, repoPath, workingDir, projectName string, composeFiles,
	envFiles, profiles []string, environment map[string]string, opts ComposeLoadOptions,
) (*types.Project, error)

LoadCompose parses and loads Compose files as specified by the Docker Compose specification. dockerCli is required to load OCI artifact includes. opts bundles the Docker-owned settings (env passthrough, Git/OCI remote include configuration) needed beyond the compose project parameters themselves; callers resolve it explicitly (see NewComposeLoadOptions) instead of LoadCompose reading the application configuration itself.

func LoadSwarmStack added in v0.73.0

func LoadSwarmStack(dockerCli command.Cli, project *types.Project,
	deployConfig *deploy.Config, externalWorkingDir string,
) (*composetypes.Config, *options.Deploy, error)

LoadSwarmStack loads a Docker Swarm stack using the provided project and deploy configuration.

func MarshalAutoDiscoveryConfig added in v0.89.0

func MarshalAutoDiscoveryConfig(cfg deployConfig.AutoDiscoveryConfig) string

MarshalAutoDiscoveryConfig serializes an AutoDiscoveryConfig to a single-line YAML flow-style string for use as a container label.

func MigrateDeploymentMode added in v0.114.0

func MigrateDeploymentMode(ctx context.Context, log *slog.Logger, dockerCli command.Cli, contextName, stackName, source string, swarmMode, swarmAvailable bool) (bool, error)

MigrateDeploymentMode removes a previous deployment in the other runtime mode, but only after proving every discovered resource belongs to this doco-cd deployment. Volumes are deliberately retained for the new mode. It reports whether previous-mode resources were removed.

func NewHttpClient

func NewHttpClient() *http.Client

func NewJobScheduleParser added in v0.86.0

func NewJobScheduleParser() gocron.Cron

func NormalizeContextName added in v0.113.0

func NormalizeContextName(name string) string

NormalizeContextName normalizes the given context name by trimming whitespace and converting the default context name to an empty string.

func ParseAutoDiscoveryConfig added in v0.89.0

func ParseAutoDiscoveryConfig(labelValue string) deployConfig.AutoDiscoveryConfig

ParseAutoDiscoveryConfig deserializes an AutoDiscoveryConfig from a YAML container label value. If the label is empty or invalid it returns a default config with Delete=true, RemoveVolumes=false, RemoveImages=true.

func ParseJobScheduleExpression added in v0.86.0

func ParseJobScheduleExpression(spec string) (gocron.Cron, error)

func ProjectFilesHaveChanges added in v0.31.1

func ProjectFilesHaveChanges(repoPathExternal string, changePaths []string, project *types.Project) ([]Change, IgnoredInfo, error)

ProjectFilesHaveChanges checks if any files related to the compose project have changed.

func ProjectHash added in v0.73.0

func ProjectHash(p *types.Project) (string, error)

ProjectHash generates a SHA256 hash of the project configuration to be used for detecting changes in the project that may require a redeployment.

func PruneStackConfigs added in v0.31.0

func PruneStackConfigs(ctx context.Context, client dockerClient.APIClient, namespace string, keepOldRevisions int) error

PruneStackConfigs removes old revisions of configs in a Docker Swarm stack, keeping only the specified number of recent revisions.

func PruneStackSecrets added in v0.31.0

func PruneStackSecrets(ctx context.Context, client dockerClient.APIClient, namespace string, keepOldRevisions int) error

PruneStackSecrets removes old revisions of secrets in a Docker Swarm stack, keeping only the specified number of recent revisions.

func PullImages added in v0.55.0

func PullImages(ctx context.Context, dockerCli command.Cli, projectName string) error

PullImages pulls all images defined in the named compose project.

func RecordDeploymentFailure added in v0.112.0

func RecordDeploymentFailure(repoName, stack string, failure DeploymentFailure)

RecordDeploymentFailure stores the failure record for a stack, replacing any previous one.

func RemoveLabeledVolumes added in v0.31.0

func RemoveLabeledVolumes(ctx context.Context, dockerClient client.APIClient, swarmMode bool, stackName string) error

func RemoveProject added in v0.33.0

func RemoveProject(ctx context.Context, dockerCli command.Cli, projectName string, timeout time.Duration, removeVolumes, removeImages bool) error

RemoveProject removes the entire project including containers, networks, volumes and images.

func RemoveSwarmStack added in v0.31.0

func RemoveSwarmStack(ctx context.Context, dockerCli command.Cli, namespace string) error

RemoveSwarmStack removes a Docker Swarm stack using the provided deploy configuration.

func RerunJobService added in v0.62.0

func RerunJobService(ctx context.Context, cli dockerClient.APIClient, serviceName string) error

RerunJobService attempts to retrigger a Swarm job service (`replicated-job` or `global-job`) by updating the service spec (bumping a dummy label), causing Swarm to create new job tasks.

Note: Swarm does not allow UpdateConfig / RollbackConfig on job-mode services, so we must strip those fields before calling ServiceUpdate.

func RestartContainer added in v0.86.0

func RestartContainer(ctx context.Context, apiClient client.APIClient, containerID string) error

func RestartContainerAndWait added in v0.104.0

func RestartContainerAndWait(ctx context.Context, apiClient client.APIClient, containerID string) error

RestartContainerAndWait starts or restarts the container (identically to RestartContainer) and then blocks until the container exits. This is the blocking variant of RestartContainer used when stop_services requires knowing when the job has finished.

For a stopped container the wait is subscribed BEFORE starting to avoid racing with a fast-exiting container. For a running container, ContainerRestart is called first (it blocks until the container is running again after the restart cycle), and then the wait is subscribed.

func RestartProject added in v0.33.0

func RestartProject(ctx context.Context, dockerCli command.Cli, projectName string, timeout time.Duration) error

RestartProject restarts all services in the specified project.

func RestartScheduledSwarmService added in v0.101.0

func RestartScheduledSwarmService(ctx context.Context, dockerCLI command.Cli, serviceName string) error

RestartScheduledSwarmService runs a restart-mode scheduled Swarm service on its schedule. Classic replicated scheduled services are deployed at 0 replicas so they do not run on deployment; this scales them up to their intended replica count (forcing a task re-run) when the schedule fires. Services that cannot be scaled to 0 (e.g. global) fall back to a ForceUpdate bump.

func RestartService added in v0.62.0

func RestartService(ctx context.Context, cli dockerClient.APIClient, serviceName string) error

RestartService restarts long-running Swarm services by bumping ForceUpdate. For job-mode services (replicated-job/global-job), it returns ErrJobServiceRestartNotSupported.

func RotateProjectCertificates added in v0.110.0

func RotateProjectCertificates(
	ctx context.Context,
	contextName string,
	dockerCli command.Cli,
	labels map[string]string,
	secretProvider secretprovider.SecretProvider,
	swarmMode bool,
	opts CertificateRotationOptions,
) error

RotateProjectCertificates reloads the deploy config for a rotatable deployment (identified by its doco-cd labels, see DocoCDLabels.Deployment.CertRotatable), re-resolves its external secrets (reissuing any pki-role certificates through the configured secret provider), and redeploys so the fresh values take effect.

contextName identifies the Docker context dockerCli was created for (empty for the local default context, see NormalizeContextName/DisplayContextName); it is only used to namespace the per-stack scheduler/deploy lock (see lock.StackKey) so that same-named stacks on different Docker contexts don't block each other. Discovered resources need no extra "context" label of their own for this: the caller (certrotation.Watcher) already knows which context's client produced labels, since it scans one context's resources at a time.

Compose deployments only recreate the services actually consuming a rotated certificate/key. Swarm stacks redeploy the whole stack, but Swarm's own spec diffing (see stableSwarmMetadataLabels) still limits recreation to the affected services.

func RunComposeOneOffFromServiceDefinition added in v0.107.0

func RunComposeOneOffFromServiceDefinition(
	ctx context.Context,
	dockerCli command.Cli,
	labels map[string]string,
	secretProvider secretprovider.SecretProvider,
	opts ScheduledComposeOptions,
) error

func RunComposeScheduledContainer added in v0.107.0

func RunComposeScheduledContainer(
	ctx context.Context,
	dockerCli command.Cli,
	containerID string,
	labels map[string]string,
	waitForExit bool,
	secretProvider secretprovider.SecretProvider,
	opts ScheduledComposeOptions,
) error

func RunContainerOneOffFromExisting added in v0.88.0

func RunContainerOneOffFromExisting(ctx context.Context, apiClient client.APIClient, containerID string) error

func RunImagePruneJob added in v0.54.0

func RunImagePruneJob(ctx context.Context, dockerCLI command.Cli) error

RunImagePruneJob runs a Docker Swarm global job to prune unused images on all nodes.

func RunImageRemoveJob added in v0.54.0

func RunImageRemoveJob(ctx context.Context, dockerCLI command.Cli, images []string) error

RunImageRemoveJob runs a Docker Swarm global job to remove specified images.

func RunSwarmJob added in v0.54.0

func RunSwarmJob(ctx context.Context, dockerCLI command.Cli, mode swarm.DeployMode, command []string, title string) error

RunSwarmJob runs a Docker Swarm job container with the specified mode and command. https://docs.docker.com/reference/cli/docker/service/create/#running-as-a-job

func RunSwarmOneOffFromService added in v0.88.0

func RunSwarmOneOffFromService(ctx context.Context, dockerCLI command.Cli, serviceName string, opts SwarmOneOffFromServiceOptions) error

RunSwarmOneOffFromService creates a temporary job service from an existing service spec and waits for completion.

func SetConfigHashPrefixes added in v0.31.0

func SetConfigHashPrefixes(stack *composetypes.Config, namespace string) error

SetConfigHashPrefixes generates hashes for the config definitions in the stack config and adds them to the config names as suffixes to trigger a redeployment when they change (Only works in Docker Swarm mode).

func SetSecretHashPrefixes added in v0.31.0

func SetSecretHashPrefixes(stack *composetypes.Config, namespace string) error

SetSecretHashPrefixes generates hashes for the secret definitions in the stack config and adds them to the secret names as suffixes to trigger a redeployment when they change (Only works in Docker Swarm mode).

func SourceTypeLabelValue added in v0.89.0

func SourceTypeLabelValue(primary, fallback string) string

SourceTypeLabelValue resolves a stable label value ("git" or "oci") from a primary source, with a fallback (e.g. deploy config source) when the primary is empty or unknown.

func StartProject added in v0.33.0

func StartProject(ctx context.Context, dockerCli command.Cli, projectName string, timeout time.Duration) error

StartProject starts all services in the specified project.

func StartProjectServices added in v0.104.0

func StartProjectServices(ctx context.Context, dockerCli command.Cli, projectName string, services []string) error

StartProjectServices starts specific named services within a compose project. Services are identified by their service name as declared in the compose file (the map key under `services:`), not by container_name.

Note: the compose Start API ignores StartOptions.Services, so containers are looked up directly by the com.docker.compose.project and com.docker.compose.service labels and started individually.

This is best-effort: if starting one container fails, the remaining containers are still attempted, and all failures are aggregated into the returned error.

func StartSwarmService added in v0.104.0

func StartSwarmService(ctx context.Context, dockerCLI command.Cli, serviceName string, replicas uint64) error

StartSwarmService restores a previously stopped swarm service to the given replica count. It is the counterpart to StopSwarmService and is typically called in a deferred function to guarantee the service is restarted even when the scheduled job fails.

A replicas value of 0 means StopSwarmService never actually stopped the service (global-mode, or already scaled to 0), so there is nothing to restore.

The serviceName must be the full swarm-scoped name (e.g. "mystack_myservice").

func StopProject added in v0.33.0

func StopProject(ctx context.Context, dockerCli command.Cli, projectName string, timeout time.Duration) error

StopProject stops all services in the specified project.

func StopProjectServices added in v0.104.0

func StopProjectServices(ctx context.Context, dockerCli command.Cli, projectName string, services []string, timeout time.Duration) error

StopProjectServices stops specific named services within a compose project. Services are identified by their service name as declared in the compose file (the map key under `services:`), not by container_name.

Containers are stopped directly via the Docker API (instead of compose Stop with a services filter) to ensure only explicitly targeted services are affected, without implicit dependency traversal.

This is best-effort: if stopping one container fails, the remaining containers are still attempted, and all failures are aggregated into the returned error.

func StopSwarmService added in v0.104.0

func StopSwarmService(ctx context.Context, dockerCLI command.Cli, serviceName string, timeout time.Duration) (originalReplicas uint64, err error)

StopSwarmService temporarily stops a swarm service by scaling it to 0 replicas and waiting until its tasks have actually terminated. It returns the original replica count so the caller can restore it later via StartSwarmService.

Waiting matters for the primary use case of this feature (consistent cold backups): ServiceUpdate only records the intent to scale down, so without waiting the scheduled job would start while the target's containers are still shutting down and flushing to disk.

Global-mode services cannot be scaled to 0; the function returns (0, ErrGlobalSwarmServiceNotScalable) so the caller can skip them gracefully. A replicated service that is already at 0 replicas returns (0, ErrSwarmServiceAlreadyStopped).

The serviceName must be the full swarm-scoped name (e.g. "mystack_myservice"). In the cd.doco.job.stop_services label, cross-stack services are expressed as "stack/service" and resolved to "stack_service" before calling this function.

func ValidateStopServicesSelfReference added in v0.104.0

func ValidateStopServicesSelfReference(project, service string, refs []StopServiceRef) error

ValidateStopServicesSelfReference returns an error if refs contains an entry that resolves to the job's own project/stack and service name, which would cause the scheduler to stop the job's own service right before running it.

This cannot be checked inside ParseJobScheduleLabels because it only has access to the raw label map: standalone/compose containers always carry com.docker.compose.project/com.docker.compose.service labels, but Swarm services deployed by doco-cd do not carry those labels on the task spec, so the job's own project/service identity must be resolved by the caller (which knows how to derive it for both compose and Swarm jobs) and passed in explicitly.

func VerifyDockerAPIAccess added in v0.58.0

func VerifyDockerAPIAccess() (error, error)

VerifyDockerAPIAccess verifies access to the Docker API either via DOCKER_HOST or the default socket.

func VerifyDockerAPIAccessContext added in v0.114.0

func VerifyDockerAPIAccessContext(ctx context.Context) (error, error)

VerifyDockerAPIAccessContext verifies access to the Docker API with context cancellation.

func VerifyDockerHostConnectionContext added in v0.114.0

func VerifyDockerHostConnectionContext(ctx context.Context, dockerHost string) error

VerifyDockerHostConnectionContext verifies the connection to the specified DOCKER_HOST with context cancellation.

func VerifySocketConnection

func VerifySocketConnection() error

VerifySocketConnection verifies whether the application can connect to the docker socket.

func VerifySocketConnectionContext added in v0.114.0

func VerifySocketConnectionContext(ctx context.Context) error

VerifySocketConnectionContext verifies whether the application can connect to the Docker socket with context cancellation.

func VerifySocketReadContext added in v0.114.0

func VerifySocketReadContext(ctx context.Context, httpClient *http.Client) error

VerifySocketReadContext verifies whether the application can read from the Docker socket with context cancellation.

func WithNormalizedEnvValues added in v0.110.0

func WithNormalizedEnvValues(p *types.Project, normMap map[string]string) *types.Project

WithNormalizedEnvValues returns a copy of the project where any service environment value or top-level config content matching a key in normMap is replaced with the corresponding placeholder. Use this to produce a stable project hash when secrets are re-issued on every resolution (e.g. pki-role certs), so the hash only changes when the ref itself changes.

Types

type CertificateRotationOptions added in v0.115.0

type CertificateRotationOptions struct {
	Scheduled      ScheduledComposeOptions
	SwarmRetention SwarmRetentionOptions
}

CertificateRotationOptions bundles the settings needed by RotateProjectCertificates to reload the project and apply the shared Swarm retention policy after a rotation redeploy.

func NewCertificateRotationOptions added in v0.115.0

func NewCertificateRotationOptions(c *app.Config) CertificateRotationOptions

NewCertificateRotationOptions builds CertificateRotationOptions from the application configuration. Call this once at a composition/stage boundary and pass the result down explicitly.

type Change added in v0.73.0

type Change struct {
	Type     string
	Services []string
}

type ComposeLoadOptions added in v0.115.0

type ComposeLoadOptions struct {
	// PassEnv controls whether the doco-cd process's own OS environment variables are passed
	// through to the compose project for variable interpolation.
	PassEnv bool
	// SkipTLSVerify skips TLS verification when following Git remote includes.
	SkipTLSVerify bool
	// HttpProxy configures the proxy used when following Git remote includes.
	HttpProxy transport.ProxyOptions
	// GitCloneSubmodules controls whether submodules are cloned for Git remote includes.
	GitCloneSubmodules bool
	// GitCloneDepth limits the number of commits fetched for Git remote includes. 0 means a full clone.
	GitCloneDepth int
	// SSHPrivateKey and SSHPrivateKeyPassphrase configure SSH authentication for Git remote includes.
	SSHPrivateKey           string
	SSHPrivateKeyPassphrase string
	// GitAccessToken configures HTTP(S) authentication for Git remote includes.
	GitAccessToken string
	// OciInsecureRegistries lists registries for OCI Compose includes with TLS verification disabled.
	OciInsecureRegistries []string
	// DataHostPath and DataMountPath are used as a fallback base directory for the Git include
	// cache when the repository path passed to LoadCompose is empty. DataHostPath (the Docker
	// daemon host path) is preferred since the cache must be reachable outside the container by
	// the daemon performing the checkout.
	DataHostPath  string
	DataMountPath string
}

ComposeLoadOptions bundles the Docker-owned settings LoadCompose needs beyond the individual compose project parameters (compose/env files, profiles, environment). These settings originate in the application configuration, but callers resolve and pass them in explicitly at a composition/stage boundary (see NewComposeLoadOptions) instead of letting LoadCompose read the application configuration itself. This keeps LoadCompose free of hidden environment reads.

func NewComposeLoadOptions added in v0.115.0

func NewComposeLoadOptions(c *app.Config) ComposeLoadOptions

NewComposeLoadOptions builds the ComposeLoadOptions LoadCompose needs from the application configuration. Call this once at a composition/stage boundary and pass the result down explicitly, rather than letting deep Docker helpers read the application configuration themselves.

type ContainerExitError added in v0.101.0

type ContainerExitError struct {
	ContainerID string
	ExitCode    int
}

ContainerExitError reports that a container finished with a non-zero exit code. Callers can use errors.As to recover the exit code without parsing error strings.

func (*ContainerExitError) Error added in v0.101.0

func (e *ContainerExitError) Error() string

type ContextClient added in v0.113.0

type ContextClient struct {
	Name      string
	Cli       command.Cli
	SwarmMode bool
}

func (ContextClient) DisplayName added in v0.113.0

func (c ContextClient) DisplayName() string

type ContextClientResult added in v0.113.0

type ContextClientResult struct {
	ContextClient
	Err error
}

type ContextRegistry added in v0.113.0

type ContextRegistry struct {
	// contains filtered or unexported fields
}

func NewContextRegistry added in v0.113.0

func NewContextRegistry(baseCli command.Cli, options ContextRegistryOptions) *ContextRegistry

NewContextRegistry creates a new ContextRegistry for the configured Docker runtime features.

func (*ContextRegistry) Close added in v0.113.0

func (r *ContextRegistry) Close() error

Close closes all docker clients in the registry and marks the registry as closed.

func (*ContextRegistry) Get added in v0.113.0

Get returns a ContextClient for the given context name.

func (*ContextRegistry) List added in v0.113.0

List returns a list of ContextClientResult for all available docker contexts in the registry.

func (*ContextRegistry) Names added in v0.113.0

func (r *ContextRegistry) Names() ([]string, error)

Names returns the names of all available docker contexts in the registry.

func (*ContextRegistry) Refresh added in v0.113.0

func (r *ContextRegistry) Refresh() error

Refresh refreshes the list of available docker contexts in the registry.

type ContextRegistryOptions added in v0.115.0

type ContextRegistryOptions struct {
	Quiet         bool
	SwarmFeatures bool
}

type DeployRequest added in v0.115.0

type DeployRequest struct {
	JobLog           *slog.Logger `validate:"required,nostructlevel"`
	ExternalRepoPath string       `validate:"required"`
	DockerCLI        command.Cli  `validate:"required,nostructlevel"`
	Payload          *webhook.ParsedPayload
	DeployConfig     *deploy.Config `validate:"required,nostructlevel"`
	DetectedChanges  []Change
	NeedSignal       []SignalService
	LatestCommit     string
	AppVersion       string `validate:"required"`
	ComposeLoad      ComposeLoadOptions
	SwarmRetention   SwarmRetentionOptions
	SwarmMode        bool
	HashNormMap      map[string]string
}

DeployRequest bundles DeployStack's per-deployment input.

type DeploymentFailure added in v0.112.0

type DeploymentFailure struct {
	Repository string
	Stack      string
	CommitSHA  string
	Stage      string
	Error      string
	FailedAt   time.Time
}

DeploymentFailure records a failed deployment attempt of one stack.

func GetDeploymentFailure added in v0.112.0

func GetDeploymentFailure(repoName, stack string) (DeploymentFailure, bool)

GetDeploymentFailure reports whether the last deployment attempt of the stack failed.

type IgnoredInfo added in v0.77.0

type IgnoredInfo struct {
	// Ignored services name
	Ignored []string `json:"ignored"`
	// Ignored services need to send signal
	NeedSendSignal []SignalService `json:"need_signal"`
}

func (IgnoredInfo) IsEmpty added in v0.77.0

func (i IgnoredInfo) IsEmpty() bool

func (IgnoredInfo) IsNeedSignal added in v0.78.0

func (i IgnoredInfo) IsNeedSignal() bool

type JobExecutionMode added in v0.86.0

type JobExecutionMode string
const (
	JobExecutionModeRestart JobExecutionMode = "restart"
	JobExecutionModeOneOff  JobExecutionMode = "one_off"
)

type JobNotifyOn added in v0.86.0

type JobNotifyOn string
const (
	JobNotifyNone    JobNotifyOn = "none"
	JobNotifySuccess JobNotifyOn = "success"
	JobNotifyFailure JobNotifyOn = "failure"
	JobNotifyAll     JobNotifyOn = "all"
)

type JobScheduleConfig added in v0.86.0

type JobScheduleConfig struct {
	Enabled       bool
	Schedule      string
	SkipRunning   bool
	ExecutionMode JobExecutionMode
	NotifyOn      JobNotifyOn
	SwarmReplicas uint64
	StopServices  []StopServiceRef
}

func ParseJobScheduleLabels added in v0.86.0

func ParseJobScheduleLabels(labels map[string]string) (JobScheduleConfig, bool, error)

func (JobScheduleConfig) ShouldNotifyFailure added in v0.86.0

func (c JobScheduleConfig) ShouldNotifyFailure() bool

func (JobScheduleConfig) ShouldNotifySuccess added in v0.86.0

func (c JobScheduleConfig) ShouldNotifySuccess() bool

type Labels added in v0.54.0

type Labels map[string]string // Labels of the Service

func SwarmJobLabels added in v0.107.0

func SwarmJobLabels(service swarm.Service) Labels

SwarmJobLabels returns the labels of a swarm service with the job configuration taken from the task template only.

Job configuration labels are authored by the user as service labels in the compose file and are therefore part of the task template, which is also where the deploy path reads them from. Honoring them from the service spec here would schedule services that are not set up as jobs during deployment.

Job runtime metadata (last/next run timestamps) is written by doco-cd itself to the service spec, so it is exempt from this rule.

func SwarmServiceLabels added in v0.107.0

func SwarmServiceLabels(service swarm.Service) Labels

SwarmServiceLabels returns the labels of a swarm service.

Deployment metadata is stored in the service spec labels, because labels in the task template are part of the service definition and changing them makes swarm recreate all tasks of the service on every deployment.

func (Labels) Get added in v0.78.0

func (l Labels) Get(key string) (string, bool)

type LatestServiceStatus added in v0.78.0

type LatestServiceStatus struct {
	DeployedStatus map[Service]ServiceStatus
	// contains filtered or unexported fields
}

func GetLatestDeployStatus added in v0.78.0

func GetLatestDeployStatus(ctx context.Context, client client.APIClient, swarmMode bool, cloneURL string, deployName string) (LatestServiceStatus, error)

GetLatestDeployStatus retrieves the deployed status for a given repository and deploy name.

func (LatestServiceStatus) GetDeploymentCommitSHA added in v0.83.0

func (l LatestServiceStatus) GetDeploymentCommitSHA() string

func (LatestServiceStatus) GetDeploymentComposeHash added in v0.83.0

func (l LatestServiceStatus) GetDeploymentComposeHash() string

type ScheduledComposeOptions added in v0.115.0

type ScheduledComposeOptions struct {
	// ComposeLoad is passed through to the LoadCompose call used to reload the project.
	ComposeLoad ComposeLoadOptions
	// DeployConfigBaseDir is the base directory (relative to the repository root) where
	// deployment configuration files are searched for.
	DeployConfigBaseDir string
	// InterpolateExternalSecrets enables Compose-style interpolation in legacy external secret
	// references using the doco-cd process environment.
	InterpolateExternalSecrets bool
}

ScheduledComposeOptions bundles the Docker-owned settings needed to reload the Compose project for a scheduled job (see RunComposeScheduledContainer/RunComposeOneOffFromServiceDefinition) or for certificate rotation (see CertificateRotationOptions), beyond what LoadCompose itself needs.

func NewScheduledComposeOptions added in v0.115.0

func NewScheduledComposeOptions(c *app.Config) ScheduledComposeOptions

NewScheduledComposeOptions builds ScheduledComposeOptions from the application configuration. Call this once at a composition/stage boundary and pass the result down explicitly.

type Service added in v0.54.0

type Service string // Name of the Service

type ServiceMismatch added in v0.78.0

type ServiceMismatch struct {
	ServiceName string                  `json:"service_name"`
	Reasons     []ServiceMismatchReason `json:"reasons"`
}

func CheckServiceMismatch added in v0.78.0

func CheckServiceMismatch(swarmModeEnabled bool, deployed map[Service]ServiceStatus, services types.Services) []ServiceMismatch

CheckServiceMismatch checks if the deployed services match the services in the compose file. now only check replicas, swarm mode, missing and unnecessary services.

type ServiceMismatchReason added in v0.78.0

type ServiceMismatchReason struct {
	Reason string `json:"reason"`
	Want   any    `json:"want"`
	Got    any    `json:"got"`
}

type ServiceStatus added in v0.78.0

type ServiceStatus struct {
	// In non-Swarm mode:
	// Labels may differ between containers within a service, but most of them should be identical for the same service,
	// except for com.docker.compose.container-number, com.docker.compose.replace, and potentially others.
	Labels Labels

	// swarm deploy mode.
	// Empty if not in swarm mode.
	SwarmMode swarmInternal.DeployMode

	// Non-swarm mode: number of running containers
	// Swarm mode: number of service replicas
	Replicas uint64
}

type SignalService added in v0.77.0

type SignalService struct {
	ServiceName string `json:"service_name"`
	Signal      string `json:"signal"`
}

type StopServiceRef added in v0.104.0

type StopServiceRef struct {
	Project string // empty = same project/stack as the job
	Service string
}

StopServiceRef identifies a compose service (or swarm service) to be temporarily stopped before a scheduled job runs and restarted after it completes.

In standalone (compose) mode:

  • Service is the compose service name as declared in the compose file (the map key under `services:`). It is always the service name, never the container_name.
  • Project identifies the compose project. When empty, the job's own project is used.

In swarm mode:

  • Service is the short service name as declared in the compose file.
  • Project is the stack name. When empty, the job's own stack is used.
  • The full swarm service name is resolved as "<project>_<service>".

type SwarmOneOffFromServiceOptions added in v0.88.0

type SwarmOneOffFromServiceOptions struct {
	Replicas         uint64
	SendRegistryAuth bool
}

type SwarmRetentionOptions added in v0.115.0

type SwarmRetentionOptions struct {
	// Config is the global default number of old Swarm config revisions to
	// keep per resource (excluding the active one). -1 disables automatic pruning.
	Config int
	// Secret is the global default number of old Swarm secret revisions to
	// keep per resource (excluding the active one). -1 disables automatic pruning.
	Secret int
}

SwarmRetentionOptions holds the global defaults for pruning superseded Swarm config and secret revisions after a deployment.

func NewSwarmRetentionOptions added in v0.115.0

func NewSwarmRetentionOptions(c *app.Config) SwarmRetentionOptions

NewSwarmRetentionOptions builds SwarmRetentionOptions from the application configuration.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL