Files
sablier/pkg/provider/docker/container_start.go
Yoann Lecuyer 0d699effc3 feat(docker): add docker pause strategy (#755)
* add tmp test

* add strategy config

* strategy config

* pause / unpause strategy impl

* Fix tests

* fix compilation

* add pause / unpause tests

* add doc

* add config test

* start if not paused

* remove test files
2025-11-27 12:03:37 -05:00

51 lines
1.7 KiB
Go

package docker
import (
"context"
"fmt"
"log/slog"
"github.com/docker/docker/api/types/container"
)
func (p *Provider) InstanceStart(ctx context.Context, name string) error {
if p.strategy == "pause" {
return p.dockerUnpause(ctx, name)
}
return p.dockerStart(ctx, name)
}
func (p *Provider) dockerStart(ctx context.Context, name string) error {
// TODO: InstanceStart should block until the container is ready.
p.l.DebugContext(ctx, "starting container", "name", name)
err := p.Client.ContainerStart(ctx, name, container.StartOptions{})
if err != nil {
p.l.ErrorContext(ctx, "cannot start container", slog.String("name", name), slog.Any("error", err))
return fmt.Errorf("cannot start container %s: %w", name, err)
}
return nil
}
func (p *Provider) dockerUnpause(ctx context.Context, name string) error {
container, inspectErr := p.Client.ContainerInspect(ctx, name)
if inspectErr != nil {
p.l.ErrorContext(ctx, "cannot inspect container before unpausing", slog.String("name", name), slog.Any("error", inspectErr))
return fmt.Errorf("cannot inspect container %s before unpausing: %w", name, inspectErr)
}
if !container.State.Paused {
p.l.DebugContext(ctx, "container is not paused, starting container", slog.String("name", name))
return p.dockerStart(ctx, name)
}
p.l.DebugContext(ctx, "unpausing container", slog.String("name", name))
err := p.Client.ContainerUnpause(ctx, name)
if err != nil {
p.l.ErrorContext(ctx, "cannot unpause container", slog.String("name", name), slog.Any("error", err))
return fmt.Errorf("cannot unpause container %s: %w", name, err)
}
p.l.DebugContext(ctx, "container unpaused", slog.String("name", name))
return nil
}