Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ require (
github.com/charmbracelet/lipgloss v1.1.0
github.com/charmbracelet/x/exp/teatest v0.0.0-20260216111343-536eb63c1f4c
github.com/containerd/errdefs v1.0.0
github.com/docker/docker v28.5.2+incompatible
github.com/docker/go-connections v0.7.0
github.com/docker/go-units v0.5.0
github.com/google/uuid v1.6.0
github.com/moby/moby/api v1.54.2
github.com/moby/moby/client v0.4.1
github.com/muesli/termenv v0.16.0
github.com/pelletier/go-toml/v2 v2.3.1
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c
Expand Down Expand Up @@ -47,11 +47,11 @@ require (
github.com/clipperhouse/displaywidth v0.10.0 // indirect
github.com/clipperhouse/uax29/v2 v2.6.0 // indirect
github.com/containerd/errdefs/pkg v0.3.0 // indirect
github.com/containerd/log v0.1.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/danieljoos/wincred v1.2.3 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/docker/go-connections v0.7.0 // indirect
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
Expand All @@ -67,14 +67,10 @@ require (
github.com/mattn/go-localereader v0.0.1 // indirect
github.com/mattn/go-runewidth v0.0.19 // indirect
github.com/moby/docker-image-spec v1.3.1 // indirect
github.com/moby/sys/atomicwriter v0.1.0 // indirect
github.com/moby/term v0.5.2 // indirect
github.com/morikuni/aec v1.1.0 // indirect
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
github.com/muesli/cancelreader v0.2.2 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
Expand All @@ -92,7 +88,6 @@ require (
golang.org/x/net v0.52.0 // indirect
golang.org/x/sys v0.44.0 // indirect
golang.org/x/text v0.35.0 // indirect
golang.org/x/time v0.14.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect
google.golang.org/grpc v1.80.0 // indirect
Expand Down
26 changes: 6 additions & 20 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
Expand Down Expand Up @@ -38,8 +36,6 @@ github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ=
Expand All @@ -49,8 +45,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM=
github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.7.0 h1:6SsRfJddP22WMrCkj19x9WKjEDTB+ahsdiGYf0mN39c=
github.com/docker/go-connections v0.7.0/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
Expand Down Expand Up @@ -96,14 +90,10 @@ github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byF
github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw=
github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs=
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=
github.com/morikuni/aec v1.1.0 h1:vBBl0pUnvi/Je71dsRrhMBtreIqNMYErSAbEeb8jrXQ=
github.com/morikuni/aec v1.1.0/go.mod h1:xDRgiq/iw5l+zkao76YTKzKttOp2cwPEne25HDkJnBw=
github.com/moby/moby/api v1.54.2 h1:wiat9QAhnDQjA7wk1kh/TqHz2I1uUA7M7t9SAl/JNXg=
github.com/moby/moby/api v1.54.2/go.mod h1:+RQ6wluLwtYaTd1WnPLykIDPekkuyD/ROWQClE83pzs=
github.com/moby/moby/client v0.4.1 h1:DMQgisVoMkmMs7fp3ROSdiBnoAu8+vo3GggFl06M/wY=
github.com/moby/moby/client v0.4.1/go.mod h1:z52C9O2POPOsnxZAy//WtKcQ32P+jT/NGeXu/7nfjGQ=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
Expand All @@ -118,8 +108,6 @@ github.com/pelletier/go-toml/v2 v2.3.1 h1:MYEvvGnQjeNkRF1qUuGolNtNExTDwct51yp7ol
github.com/pelletier/go-toml/v2 v2.3.1/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
Expand All @@ -130,8 +118,6 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4=
github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
Expand Down Expand Up @@ -198,8 +184,6 @@ golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4=
golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk=
golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA=
Expand All @@ -220,3 +204,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk=
pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
82 changes: 47 additions & 35 deletions internal/runtime/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ import (
"strings"
"time"

"net/netip"

"github.com/containerd/errdefs"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/api/types/image"
"github.com/docker/docker/client"
"github.com/docker/docker/pkg/stdcopy"
"github.com/docker/go-connections/nat"
"github.com/moby/moby/api/pkg/stdcopy"
"github.com/moby/moby/api/types/container"
"github.com/moby/moby/api/types/network"
"github.com/moby/moby/client"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"

"github.com/localstack/lstk/internal/output"
Expand All @@ -35,7 +35,6 @@ type DockerRuntime struct {
func NewDockerRuntime(dockerHost string) (*DockerRuntime, error) {
opts := []client.Opt{
client.FromEnv,
client.WithAPIVersionNegotiation(),
client.WithTraceOptions(
otelhttp.WithSpanNameFormatter(func(_ string, r *http.Request) string {
return "docker " + r.Method + " " + r.URL.Path
Expand All @@ -51,7 +50,7 @@ func NewDockerRuntime(dockerHost string) (*DockerRuntime, error) {
}
}

cli, err := client.NewClientWithOpts(opts...)
cli, err := client.New(opts...)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -139,7 +138,7 @@ func socketPathFromHost(host string) string {
}

func (d *DockerRuntime) IsHealthy(ctx context.Context) error {
_, err := d.client.Ping(ctx)
_, err := d.client.Ping(ctx, client.PingOptions{})
if err != nil {
return fmt.Errorf("cannot connect to Docker daemon: %w", err)
}
Expand Down Expand Up @@ -182,7 +181,7 @@ func windowsDockerStartCommand(getenv func(string) string, lookPath func(string)
}

func (d *DockerRuntime) PullImage(ctx context.Context, imageName string, progress chan<- PullProgress) error {
reader, err := d.client.ImagePull(ctx, imageName, image.PullOptions{})
reader, err := d.client.ImagePull(ctx, imageName, client.ImagePullOptions{})
if err != nil {
return err
}
Expand Down Expand Up @@ -230,18 +229,26 @@ func (d *DockerRuntime) PullImage(ctx context.Context, imageName string, progres
}

func (d *DockerRuntime) Start(ctx context.Context, config ContainerConfig) (string, error) {
containerPort := nat.Port(config.ContainerPort)
exposedPorts := nat.PortSet{containerPort: struct{}{}}
portBindings := nat.PortMap{containerPort: []nat.PortBinding{{HostIP: "127.0.0.1", HostPort: config.Port}}}
loopback := netip.MustParseAddr("127.0.0.1")

containerPort, err := network.ParsePort(config.ContainerPort)
if err != nil {
return "", fmt.Errorf("invalid container port %q: %w", config.ContainerPort, err)
}
exposedPorts := network.PortSet{containerPort: struct{}{}}
portBindings := network.PortMap{containerPort: []network.PortBinding{{HostIP: loopback, HostPort: config.Port}}}

for _, ep := range config.ExtraPorts {
proto := ep.Protocol
if proto == "" {
proto = "tcp"
}
p := nat.Port(ep.ContainerPort + "/" + proto)
p, err := network.ParsePort(ep.ContainerPort + "/" + proto)
if err != nil {
return "", fmt.Errorf("invalid extra port %q: %w", ep.ContainerPort, err)
}
exposedPorts[p] = struct{}{}
portBindings[p] = []nat.PortBinding{{HostIP: "127.0.0.1", HostPort: ep.HostPort}}
portBindings[p] = []network.PortBinding{{HostIP: loopback, HostPort: ep.HostPort}}
}

var binds []string
Expand All @@ -253,34 +260,34 @@ func (d *DockerRuntime) Start(ctx context.Context, config ContainerConfig) (stri
binds = append(binds, bind)
}

resp, err := d.client.ContainerCreate(ctx,
&container.Config{
resp, err := d.client.ContainerCreate(ctx, client.ContainerCreateOptions{
Config: &container.Config{
Image: config.Image,
ExposedPorts: exposedPorts,
Env: config.Env,
},
&container.HostConfig{
HostConfig: &container.HostConfig{
PortBindings: portBindings,
Binds: binds,
},
nil, nil, config.Name,
)
Name: config.Name,
})
if err != nil {
return "", err
}

if err := d.client.ContainerStart(ctx, resp.ID, container.StartOptions{}); err != nil {
if _, err := d.client.ContainerStart(ctx, resp.ID, client.ContainerStartOptions{}); err != nil {
return "", err
}

return resp.ID, nil
}

func (d *DockerRuntime) Stop(ctx context.Context, containerName string) error {
if err := d.client.ContainerStop(ctx, containerName, container.StopOptions{}); err != nil {
if _, err := d.client.ContainerStop(ctx, containerName, client.ContainerStopOptions{}); err != nil {
return err
}
err := d.client.ContainerRemove(ctx, containerName, container.RemoveOptions{})
_, err := d.client.ContainerRemove(ctx, containerName, client.ContainerRemoveOptions{})
// Ignore conflict and not-found: container is gone, which is the goal.
if err != nil && !errdefs.IsConflict(err) && !errdefs.IsNotFound(err) {
return err
Expand All @@ -289,34 +296,35 @@ func (d *DockerRuntime) Stop(ctx context.Context, containerName string) error {
}

func (d *DockerRuntime) Remove(ctx context.Context, containerName string) error {
return d.client.ContainerRemove(ctx, containerName, container.RemoveOptions{})
_, err := d.client.ContainerRemove(ctx, containerName, client.ContainerRemoveOptions{})
return err
}

func (d *DockerRuntime) IsRunning(ctx context.Context, containerID string) (bool, error) {
inspect, err := d.client.ContainerInspect(ctx, containerID)
inspect, err := d.client.ContainerInspect(ctx, containerID, client.ContainerInspectOptions{})
if err != nil {
if errdefs.IsNotFound(err) {
return false, nil
}
return false, err
}
return inspect.State.Running, nil
return inspect.Container.State.Running, nil
}

func (d *DockerRuntime) ContainerStartedAt(ctx context.Context, containerName string) (time.Time, error) {
inspect, err := d.client.ContainerInspect(ctx, containerName)
inspect, err := d.client.ContainerInspect(ctx, containerName, client.ContainerInspectOptions{})
if err != nil {
return time.Time{}, fmt.Errorf("failed to inspect container: %w", err)
}
t, err := time.Parse(time.RFC3339Nano, inspect.State.StartedAt)
t, err := time.Parse(time.RFC3339Nano, inspect.Container.State.StartedAt)
if err != nil {
return time.Time{}, fmt.Errorf("failed to parse container start time: %w", err)
}
return t, nil
}

func (d *DockerRuntime) Logs(ctx context.Context, containerID string, tail int) (string, error) {
options := container.LogsOptions{
options := client.ContainerLogsOptions{
ShowStdout: true,
ShowStderr: true,
Tail: "50",
Expand Down Expand Up @@ -344,7 +352,7 @@ func (d *DockerRuntime) Logs(ctx context.Context, containerID string, tail int)
}

func (d *DockerRuntime) StreamLogs(ctx context.Context, containerID string, out io.Writer, follow bool) error {
reader, err := d.client.ContainerLogs(ctx, containerID, container.LogsOptions{
reader, err := d.client.ContainerLogs(ctx, containerID, client.ContainerLogsOptions{
ShowStdout: true,
ShowStderr: true,
Follow: follow,
Expand Down Expand Up @@ -373,20 +381,24 @@ func (d *DockerRuntime) StreamLogs(ctx context.Context, containerID string, out
}

func (d *DockerRuntime) GetBoundPort(ctx context.Context, containerName string, containerPort string) (string, error) {
inspect, err := d.client.ContainerInspect(ctx, containerName)
inspect, err := d.client.ContainerInspect(ctx, containerName, client.ContainerInspectOptions{})
if err != nil {
return "", fmt.Errorf("failed to inspect container: %w", err)
}
bindings, ok := inspect.NetworkSettings.Ports[nat.Port(containerPort)]
port, err := network.ParsePort(containerPort)
if err != nil {
return "", fmt.Errorf("invalid container port %q: %w", containerPort, err)
}
bindings, ok := inspect.Container.NetworkSettings.Ports[port]
if !ok || len(bindings) == 0 {
return "", fmt.Errorf("no binding found for port %s on container %s", containerPort, containerName)
}
return bindings[0].HostPort, nil
}

func (d *DockerRuntime) FindRunningByImage(ctx context.Context, imageRepos []string, containerPort string) (*RunningContainer, error) {
list, err := d.client.ContainerList(ctx, container.ListOptions{
Filters: filters.NewArgs(filters.Arg("status", "running")),
list, err := d.client.ContainerList(ctx, client.ContainerListOptions{
Filters: make(client.Filters).Add("status", "running"),
})
if err != nil {
return nil, err
Expand All @@ -401,7 +413,7 @@ func (d *DockerRuntime) FindRunningByImage(ctx context.Context, imageRepos []str
return nil, fmt.Errorf("invalid container port %q: %w", containerPort, err)
}

for _, c := range list {
for _, c := range list.Items {
if !matchesAnyImageRepo(c.Image, imageRepos) {
continue
}
Expand Down
Loading
Loading