Skip to content

[BUG] Map memory race when pulling in images #12844

@esemeniuc

Description

@esemeniuc

Description

Docker 2.8.1.1 on Ubuntu 24.04.2 (freshly installed) and docker installed via get.docker.com script
Image

Cmd:

  docker compose --env-file ./config/.env.test up --remove-orphans --renew-anon-volumes --detach
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    CARGO_HOME: /home/ubuntu/.cargo
    CARGO_INCREMENTAL: 0
    CARGO_TERM_COLOR: always
    DOCKER_BUILDKIT: 1
    IS_DEBUG: false
    GITHUB_ACCESS_TOKEN: ***
    ORG: xxxlabs
    TAG: dacef7c0cda969db3b727c3c2e779667e8342779

Full error:

fatal error: concurrent map writes

goroutine 308 [running]:
github.com/docker/compose/v2/pkg/compose.(*composeService).pullRequiredImages.func1.1()
	github.com/docker/compose/v2/pkg/compose/pull.go:328 +0x236
golang.org/x/sync/errgroup.(*Group).Go.func1()
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:79 +0x50
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 61
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:76 +0x96

goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc000880f18?)
	runtime/sema.go:71 +0x25
sync.(*WaitGroup).Wait(0x25d4c40?)
	sync/waitgroup.go:118 +0x48
golang.org/x/sync/errgroup.(*Group).Wait(0xc0008ab140)
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:56 +0x25
github.com/docker/compose/v2/pkg/progress.RunWithStatus({0x2bba6c8, 0xc000816ea0}, 0xc000876060, 0xc0004718c0, {0x27d7fae, 0x7})
	github.com/docker/compose/v2/pkg/progress/writer.go:97 +0x225
github.com/docker/compose/v2/pkg/progress.Run({0x2bba6c8, 0xc000816ea0}, 0xc0008ab100, 0xc0004718c0)
	github.com/docker/compose/v2/pkg/progress/writer.go:61 +0x85
github.com/docker/compose/v2/pkg/compose.(*composeService).Up(0xc000421340, {0x2bba6c8, 0xc000816ea0}, _, {{0xc000a22000, {0xc0003919b0, 0x0, 0x3}, 0x1, 0x0, ...}, ...})
	github.com/docker/compose/v2/pkg/compose/up.go:40 +0x213
github.com/docker/compose/v2/cmd/compose.runUp({_, _}, {_, _}, {_, _}, {0x0, 0x0, {0x27d632b, 0x6}, ...}, ...)
	github.com/docker/compose/v2/cmd/compose/up.go:319 +0xb54
github.com/docker/compose/v2/cmd/compose.upCommand.func2({0x2bba6c8, 0xc000816ea0}, 0xc0005537a0, {0xc0003919b0, 0x0, 0x3})
	github.com/docker/compose/v2/cmd/compose/up.go:143 +0x29f
github.com/docker/compose/v2/cmd/compose.upCommand.(*ProjectOptions).WithServices.func5({0x2bba700, 0xc0001ea1e0}, {0xc0003919b0, 0x0, 0x3})
	github.com/docker/compose/v2/cmd/compose/compose.go:187 +0x22d
github.com/docker/compose/v2/cmd/compose.upCommand.(*ProjectOptions).WithServices.Adapt.func7({0x2bba700?, 0xc0001ea1e0?}, 0x2?, {0xc0003919b0?, 0x2b9f088?, 0x9d433a?})
	github.com/docker/compose/v2/cmd/compose/compose.go:137 +0x30
github.com/docker/compose/v2/cmd/compose.upCommand.(*ProjectOptions).WithServices.Adapt.AdaptCmd.func8(0xc000239508, {0xc0003919b0, 0x0, 0x3})
	github.com/docker/compose/v2/cmd/compose/compose.go:121 +0x143
github.com/docker/cli/cli-plugins/plugin.RunPlugin.func1.1.2(0xc000239508, {0xc0003919b0, 0x0, 0x3})
	github.com/docker/cli@v28.1.0+incompatible/cli-plugins/plugin/plugin.go:65 +0x6c
github.com/docker/compose/v2/cmd/cmdtrace.Setup.wrapRunE.func2(0xc000239508?, {0xc0003919b0?, 0x0?, 0x3?})
	github.com/docker/compose/v2/cmd/cmdtrace/cmd_span.go:85 +0x63
github.com/spf13/cobra.(*Command).execute(0xc000239508, {0xc00014ba10, 0x3, 0x3})
	github.com/spf13/cobra@v1.9.1/command.go:1015 +0xa94
github.com/spf13/cobra.(*Command).ExecuteC(0xc000544f08)
	github.com/spf13/cobra@v1.9.1/command.go:1148 +0x40c
github.com/spf13/cobra.(*Command).Execute(...)
	github.com/spf13/cobra@v1.9.1/command.go:1071
github.com/docker/cli/cli-plugins/plugin.RunPlugin(0xc000437cc0, 0xc000239208, {{0x27d4d6a, 0x5}, {0x27dedc8, 0xb}, {0x2b8a0a8, 0x7}, {0x0, 0x0}, ...})
	github.com/docker/cli@v28.1.0+incompatible/cli-plugins/plugin/plugin.go:80 +0x145
github.com/docker/cli/cli-plugins/plugin.Run(0x2931458, {{0x27d4d6a, 0x5}, {0x27dedc8, 0xb}, {0x2b8a0a8, 0x7}, {0x0, 0x0}, {0x0, ...}})
	github.com/docker/cli@v28.1.0+incompatible/cli-plugins/plugin/plugin.go:95 +0x105
main.pluginMain()
	github.com/docker/compose/v2/cmd/main.go:38 +0xa5
main.main()
	github.com/docker/compose/v2/cmd/main.go:98 +0x19c

goroutine 54 [IO wait]:
internal/poll.runtime_pollWait(0x7b33b7a956b0, 0x72)
	runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0xc0003f3400?, 0xc0004787bf?, 0x0)
	internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
	internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc0003f3400, {0xc0004787bf, 0x1, 0x1})
	internal/poll/fd_unix.go:165 +0x27a
net.(*netFD).Read(0xc0003f3400, {0xc0004787bf?, 0x0?, 0x0?})
	net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc0006a4760, {0xc0004787bf?, 0x0?, 0x0?})
	net/net.go:189 +0x45
github.com/docker/cli/cli-plugins/socket.ConnectAndWait.func1()
	github.com/docker/cli@v28.1.0+incompatible/cli-plugins/socket/socket.go:162 +0x45
created by github.com/docker/cli/cli-plugins/socket.ConnectAndWait in goroutine 1
	github.com/docker/cli@v28.1.0+incompatible/cli-plugins/socket/socket.go:159 +0x118

goroutine 187 [select]:
net/http.(*persistConn).writeLoop(0xc000ac8240)
	net/http/transport.go:2519 +0xe7
created by net/http.(*Transport).dialConn in goroutine 214
	net/http/transport.go:1875 +0x15a5

goroutine 66 [runnable]:
go.opentelemetry.io/otel/sdk/trace.(*batchSpanProcessor).processQueue(0xc0005ca000)
	go.opentelemetry.io/otel/sdk@v1.34.0/trace/batch_span_processor.go:302 +0x114
go.opentelemetry.io/otel/sdk/trace.NewBatchSpanProcessor.func1()
	go.opentelemetry.io/otel/sdk@v1.34.0/trace/batch_span_processor.go:117 +0x4e
created by go.opentelemetry.io/otel/sdk/trace.NewBatchSpanProcessor in goroutine 1
	go.opentelemetry.io/otel/sdk@v1.34.0/trace/batch_span_processor.go:115 +0x2e5

goroutine 67 [syscall]:
os/signal.signal_recv()
	runtime/sigqueue.go:152 +0x29
os/signal.loop()
	os/signal/signal_unix.go:23 +0x13
created by os/signal.Notify.func1.1 in goroutine 1
	os/signal/signal.go:151 +0x1f

goroutine 68 [chan receive]:
github.com/docker/compose/v2/cmd/compose.upCommand.AdaptCmd.func4.1()
	github.com/docker/compose/v2/cmd/compose/compose.go:115 +0x27
created by github.com/docker/compose/v2/cmd/compose.upCommand.AdaptCmd.func4 in goroutine 1
	github.com/docker/compose/v2/cmd/compose/compose.go:114 +0x10a

goroutine 69 [chan receive]:
github.com/docker/compose/v2/cmd/compose.upCommand.(*ProjectOptions).WithServices.Adapt.AdaptCmd.func8.1()
	github.com/docker/compose/v2/cmd/compose/compose.go:115 +0x27
created by github.com/docker/compose/v2/cmd/compose.upCommand.(*ProjectOptions).WithServices.Adapt.AdaptCmd.func8 in goroutine 1
	github.com/docker/compose/v2/cmd/compose/compose.go:114 +0x10a

goroutine 12 [select]:
github.com/docker/compose/v2/pkg/progress.(*plainWriter).Start(0xc00088c320, {0x2bba290, 0x4147d60})
	github.com/docker/compose/v2/pkg/progress/plain.go:34 +0x67
github.com/docker/compose/v2/pkg/progress.RunWithStatus.func1()
	github.com/docker/compose/v2/pkg/progress/writer.go:83 +0x2a
golang.org/x/sync/errgroup.(*Group).Go.func1()
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:79 +0x50
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 1
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:76 +0x96

goroutine 13 [semacquire]:
sync.runtime_Semacquire(0xc0008802e8?)
	runtime/sema.go:71 +0x25
sync.(*WaitGroup).Wait(0x25d4c40?)
	sync/waitgroup.go:118 +0x48
golang.org/x/sync/errgroup.(*Group).Wait(0xc0002cf240)
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:56 +0x25
github.com/docker/compose/v2/pkg/progress.RunWithStatus({0x2bba6c8, 0xc0008478f0}, 0xc000b26510, 0xc0004718c0, {0x27d7fae, 0x7})
	github.com/docker/compose/v2/pkg/progress/writer.go:97 +0x225
github.com/docker/compose/v2/pkg/progress.Run({0x2bba6c8, 0xc0008478f0}, 0xc000847950, 0xc0004718c0)
	github.com/docker/compose/v2/pkg/progress/writer.go:61 +0x85
github.com/docker/compose/v2/pkg/compose.(*composeService).pullRequiredImages(0xc000421340, {0x2bba6c8, 0xc0008478f0}, 0xc0005537a0, 0xc0005a6900, 0x0)
	github.com/docker/compose/v2/pkg/compose/pull.go:320 +0x2ef
github.com/docker/compose/v2/pkg/compose.(*composeService).ensureImagesExists.func1({0x2bba6c8?, 0xc0008478f0?})
	github.com/docker/compose/v2/pkg/compose/build.go:278 +0x37
github.com/docker/compose/v2/pkg/compose.(*composeService).ensureImagesExists.SpanWrapFunc.func3({0x2bba6c8, 0xc0005a68d0})
	github.com/docker/compose/v2/internal/tracing/wrap.go:43 +0x13d
github.com/docker/compose/v2/pkg/compose.(*composeService).ensureImagesExists(0xc000421340, {0x2bba6c8, 0xc0005a68d0}, 0xc0005537a0, 0xc000a22000, 0x0)
	github.com/docker/compose/v2/pkg/compose/build.go:280 +0x29e
github.com/docker/compose/v2/pkg/compose.(*composeService).create(0xc000421340, {0x2bba6c8, 0xc0005a68d0}, 0xc0005537a0, {0xc000a22000, {0xc000284a00, 0x17, 0x20}, 0x1, 0x0, ...})
	github.com/docker/compose/v2/pkg/compose/create.go:83 +0xdf
github.com/docker/compose/v2/pkg/compose.(*composeService).Up.func1({0x2bba6c8, 0xc0005a68d0})
	github.com/docker/compose/v2/pkg/compose/up.go:41 +0x85
github.com/docker/compose/v2/pkg/compose.(*composeService).Up.SpanWrapFunc.func5({0x2bba6c8, 0xc0005a68a0})
	github.com/docker/compose/v2/internal/tracing/wrap.go:43 +0x13d
github.com/docker/compose/v2/pkg/progress.Run.func1({0x2bba6c8?, 0xc0005a68a0?})
	github.com/docker/compose/v2/pkg/progress/writer.go:62 +0x22
github.com/docker/compose/v2/pkg/progress.RunWithStatus.func2()
	github.com/docker/compose/v2/pkg/progress/writer.go:90 +0x70
golang.org/x/sync/errgroup.(*Group).Go.func1()
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:79 +0x50
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 1
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:76 +0x96

goroutine 231 [select]:
net/http.(*persistConn).readLoop(0xc00041c480)
	net/http/transport.go:2325 +0xca5
created by net/http.(*Transport).dialConn in goroutine 133
	net/http/transport.go:1874 +0x154f

goroutine 60 [select]:
github.com/docker/compose/v2/pkg/progress.(*plainWriter).Start(0xc0001a6860, {0x2bba290, 0x4147d60})
	github.com/docker/compose/v2/pkg/progress/plain.go:34 +0x67
github.com/docker/compose/v2/pkg/progress.RunWithStatus.func1()
	github.com/docker/compose/v2/pkg/progress/writer.go:83 +0x2a
golang.org/x/sync/errgroup.(*Group).Go.func1()
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:79 +0x50
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 13
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:76 +0x96

goroutine 186 [select]:
net/http.(*persistConn).readLoop(0xc000ac8240)
	net/http/transport.go:2325 +0xca5
created by net/http.(*Transport).dialConn in goroutine 214
	net/http/transport.go:1874 +0x154f

goroutine 232 [select]:
net/http.(*persistConn).writeLoop(0xc00041c480)
	net/http/transport.go:2519 +0xe7
created by net/http.(*Transport).dialConn in goroutine 133
	net/http/transport.go:1875 +0x15a5

goroutine 63 [IO wait]:
internal/poll.runtime_pollWait(0x7b33b7a94aa8, 0x72)
	runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0xc0009ac080?, 0xc00086c000?, 0x0)
	internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
	internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc0009ac080, {0xc00086c000, 0x1000, 0x1000})
	internal/poll/fd_unix.go:165 +0x27a
net.(*netFD).Read(0xc0009ac080, {0xc00086c000?, 0x0?, 0x0?})
	net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc00079c160, {0xc00086c000?, 0x0?, 0xc000504fc0?})
	net/net.go:189 +0x45
net/http.(*persistConn).Read(0xc000ac8240, {0xc00086c000?, 0x0?, 0x17?})
	net/http/transport.go:2052 +0x4a
bufio.(*Reader).fill(0xc000b00420)
	bufio/bufio.go:110 +0x103
bufio.(*Reader).ReadSlice(0xc000b00420, 0xa)
	bufio/bufio.go:376 +0x29
net/http/internal.readChunkLine(0x0?)
	net/http/internal/chunked.go:156 +0x1c
net/http/internal.(*chunkedReader).beginChunk(0xc0007e8b10)
	net/http/internal/chunked.go:49 +0x25
net/http/internal.(*chunkedReader).Read(0xc0007e8b10, {0xc000873802?, 0x0?, 0xc00083e650?})
	net/http/internal/chunked.go:125 +0x131
net/http.(*body).readLocked(0xc000796bc0, {0xc000873802?, 0xc0006e8680?, 0xc000194140?})
	net/http/transfer.go:844 +0x3b
net/http.(*body).Read(0x4?, {0xc000873802?, 0x224bc60?, 0x414b960?})
	net/http/transfer.go:836 +0x112
net/http.(*bodyEOFSignal).Read(0xc000796c00, {0xc000873802, 0x5fe, 0x5fe})
	net/http/transport.go:2913 +0x13f
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp.(*wrappedBody).Read(0xc000796cc0, {0xc000873802?, 0x0?, 0x0?})
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp@v0.56.0/transport.go:229 +0x2d
encoding/json.(*Decoder).refill(0xc000316c80)
	encoding/json/stream.go:165 +0x188
encoding/json.(*Decoder).readValue(0xc000316c80)
	encoding/json/stream.go:140 +0x85
encoding/json.(*Decoder).Decode(0xc000316c80, {0x23690c0, 0xc0005a4630})
	encoding/json/stream.go:63 +0x75
github.com/docker/compose/v2/pkg/compose.(*composeService).pullServiceImage(_, {_, _}, {{0xc000340688, 0x4}, {0x0, 0x0, 0x0}, 0x0, 0x0, ...}, ...)
	github.com/docker/compose/v2/pkg/compose/pull.go:231 +0x4b0
github.com/docker/compose/v2/pkg/compose.(*composeService).pullRequiredImages.func1.1()
	github.com/docker/compose/v2/pkg/compose/pull.go:327 +0x170
golang.org/x/sync/errgroup.(*Group).Go.func1()
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:79 +0x50
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 61
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:76 +0x96

goroutine 184 [select]:
net/http.(*persistConn).readLoop(0xc00071e360)
	net/http/transport.go:2325 +0xca5
created by net/http.(*Transport).dialConn in goroutine 206
	net/http/transport.go:1874 +0x154f

goroutine 204 [IO wait]:
internal/poll.runtime_pollWait(0x7b336857d658, 0x72)
	runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0xc0002d6600?, 0xc00100d000?, 0x0)
	internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
	internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc0002d6600, {0xc00100d000, 0x1000, 0x1000})
	internal/poll/fd_unix.go:165 +0x27a
net.(*netFD).Read(0xc0002d6600, {0xc00100d000?, 0x0?, 0x2b915a0?})
	net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc0008c6028, {0xc00100d000?, 0x0?, 0x0?})
	net/net.go:189 +0x45
net/http.(*persistConn).Read(0xc0008da240, {0xc00100d000?, 0x7841c5?, 0x23877c0?})
	net/http/transport.go:2052 +0x4a
bufio.(*Reader).fill(0xc000193e00)
	bufio/bufio.go:110 +0x103
bufio.(*Reader).Peek(0xc000193e00, 0x1)
	bufio/bufio.go:148 +0x53
net/http.(*persistConn).readLoop(0xc0008da240)
	net/http/transport.go:2205 +0x185
created by net/http.(*Transport).dialConn in goroutine 149
	net/http/transport.go:1874 +0x154f

goroutine 185 [select]:
net/http.(*persistConn).writeLoop(0xc00071e360)
	net/http/transport.go:2519 +0xe7
created by net/http.(*Transport).dialConn in goroutine 206
	net/http/transport.go:1875 +0x15a5

goroutine 65 [IO wait]:
internal/poll.runtime_pollWait(0x7b33b7a94df0, 0x72)
	runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0xc000a42080?, 0xc000d30000?, 0x0)
	internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
	internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000a42080, {0xc000d30000, 0x1000, 0x1000})
	internal/poll/fd_unix.go:165 +0x27a
net.(*netFD).Read(0xc000a42080, {0xc000d30000?, 0x0?, 0x0?})
	net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc000a24028, {0xc000d30000?, 0x0?, 0xc0009a61c0?})
	net/net.go:189 +0x45
net/http.(*persistConn).Read(0xc000b46120, {0xc000d30000?, 0x0?, 0x61?})
	net/http/transport.go:2052 +0x4a
bufio.(*Reader).fill(0xc000ac6480)
	bufio/bufio.go:110 +0x103
bufio.(*Reader).ReadSlice(0xc000ac6480, 0xa)
	bufio/bufio.go:376 +0x29
net/http/internal.readChunkLine(0x0?)
	net/http/internal/chunked.go:156 +0x1c
net/http/internal.(*chunkedReader).beginChunk(0xc0007e8450)
	net/http/internal/chunked.go:49 +0x25
net/http/internal.(*chunkedReader).Read(0xc0007e8450, {0xc00020d202?, 0x0?, 0xc0005d6650?})
	net/http/internal/chunked.go:125 +0x131
net/http.(*body).readLocked(0xc000796280, {0xc00020d202?, 0xc0006e8680?, 0xc000194140?})
	net/http/transfer.go:844 +0x3b
net/http.(*body).Read(0x4?, {0xc00020d202?, 0x224bc60?, 0x414b960?})
	net/http/transfer.go:836 +0x112
net/http.(*bodyEOFSignal).Read(0xc0007962c0, {0xc00020d202, 0x5fe, 0x5fe})
	net/http/transport.go:2913 +0x13f
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp.(*wrappedBody).Read(0xc0007963c0, {0xc00020d202?, 0x0?, 0x0?})
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp@v0.56.0/transport.go:229 +0x2d
encoding/json.(*Decoder).refill(0xc000316280)
	encoding/json/stream.go:165 +0x188
encoding/json.(*Decoder).readValue(0xc000316280)
	encoding/json/stream.go:140 +0x85
encoding/json.(*Decoder).Decode(0xc000316280, {0x23690c0, 0xc000515440})
	encoding/json/stream.go:63 +0x75
github.com/docker/compose/v2/pkg/compose.(*composeService).pullServiceImage(_, {_, _}, {{0xc000341350, 0xa}, {0x0, 0x0, 0x0}, 0x0, 0x0, ...}, ...)
	github.com/docker/compose/v2/pkg/compose/pull.go:231 +0x4b0
github.com/docker/compose/v2/pkg/compose.(*composeService).pullRequiredImages.func1.1()
	github.com/docker/compose/v2/pkg/compose/pull.go:327 +0x170
golang.org/x/sync/errgroup.(*Group).Go.func1()
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:79 +0x50
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 61
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:76 +0x96

goroutine 64 [IO wait]:
internal/poll.runtime_pollWait(0x7b33b7a95368, 0x72)
	runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0xc000a22100?, 0xc0009e1000?, 0x0)
	internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
	internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000a22100, {0xc0009e1000, 0x1000, 0x1000})
	internal/poll/fd_unix.go:165 +0x27a
net.(*netFD).Read(0xc000a22100, {0xc0009e1000?, 0x0?, 0x0?})
	net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc00099a018, {0xc0009e1000?, 0x0?, 0xc0009a6380?})
	net/net.go:189 +0x45
net/http.(*persistConn).Read(0xc00041c480, {0xc0009e1000?, 0x0?, 0x1d?})
	net/http/transport.go:2052 +0x4a
bufio.(*Reader).fill(0xc000b84720)
	bufio/bufio.go:110 +0x103
bufio.(*Reader).ReadSlice(0xc000b84720, 0xa)
	bufio/bufio.go:376 +0x29
net/http/internal.readChunkLine(0x0?)
	net/http/internal/chunked.go:156 +0x1c
net/http/internal.(*chunkedReader).beginChunk(0xc0007e86f0)
	net/http/internal/chunked.go:49 +0x25
net/http/internal.(*chunkedReader).Read(0xc0007e86f0, {0xc000872c02?, 0x0?, 0xc0007d8650?})
	net/http/internal/chunked.go:125 +0x131
net/http.(*body).readLocked(0xc000796940, {0xc000872c02?, 0xc0006e8680?, 0xc000194140?})
	net/http/transfer.go:844 +0x3b
net/http.(*body).Read(0x4?, {0xc000872c02?, 0x224bc60?, 0x414b960?})
	net/http/transfer.go:836 +0x112
net/http.(*bodyEOFSignal).Read(0xc000796980, {0xc000872c02, 0x5fe, 0x5fe})
	net/http/transport.go:2913 +0x13f
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp.(*wrappedBody).Read(0xc000796a40, {0xc000872c02?, 0x0?, 0x0?})
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp@v0.56.0/transport.go:229 +0x2d
encoding/json.(*Decoder).refill(0xc000316a00)
	encoding/json/stream.go:165 +0x188
encoding/json.(*Decoder).readValue(0xc000316a00)
	encoding/json/stream.go:140 +0x85
encoding/json.(*Decoder).Decode(0xc000316a00, {0x23690c0, 0xc000514f30})
	encoding/json/stream.go:63 +0x75
github.com/docker/compose/v2/pkg/compose.(*composeService).pullServiceImage(_, {_, _}, {{0xc000340b04, 0x5}, {0x0, 0x0, 0x0}, 0x0, 0x0, ...}, ...)
	github.com/docker/compose/v2/pkg/compose/pull.go:231 +0x4b0
github.com/docker/compose/v2/pkg/compose.(*composeService).pullRequiredImages.func1.1()
	github.com/docker/compose/v2/pkg/compose/pull.go:327 +0x170
golang.org/x/sync/errgroup.(*Group).Go.func1()
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:79 +0x50
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 61
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:76 +0x96

goroutine 233 [select]:
net/http.(*persistConn).readLoop(0xc000a3fc20)
	net/http/transport.go:2325 +0xca5
created by net/http.(*Transport).dialConn in goroutine 313
	net/http/transport.go:1874 +0x154f

goroutine 306 [IO wait]:
internal/poll.runtime_pollWait(0x7b336857d770, 0x72)
	runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0xc000666100?, 0xc00094b000?, 0x0)
	internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
	internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000666100, {0xc00094b000, 0x1000, 0x1000})
	internal/poll/fd_unix.go:165 +0x27a
net.(*netFD).Read(0xc000666100, {0xc00094b000?, 0x0?, 0x0?})
	net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc000632028, {0xc00094b000?, 0x0?, 0xc000bce000?})
	net/net.go:189 +0x45
net/http.(*persistConn).Read(0xc00071e360, {0xc00094b000?, 0x0?, 0x17?})
	net/http/transport.go:2052 +0x4a
bufio.(*Reader).fill(0xc00069ac60)
	bufio/bufio.go:110 +0x103
bufio.(*Reader).ReadSlice(0xc00069ac60, 0xa)
	bufio/bufio.go:376 +0x29
net/http/internal.readChunkLine(0x0?)
	net/http/internal/chunked.go:156 +0x1c
net/http/internal.(*chunkedReader).beginChunk(0xc0007e8a80)
	net/http/internal/chunked.go:49 +0x25
net/http/internal.(*chunkedReader).Read(0xc0007e8a80, {0xc000873202?, 0x0?, 0xc0006f0650?})
	net/http/internal/chunked.go:125 +0x131
net/http.(*body).readLocked(0xc000796a80, {0xc000873202?, 0xc0006e8680?, 0xc000194140?})
	net/http/transfer.go:844 +0x3b
net/http.(*body).Read(0x4?, {0xc000873202?, 0x224bc60?, 0x414b960?})
	net/http/transfer.go:836 +0x112
net/http.(*bodyEOFSignal).Read(0xc000796ac0, {0xc000873202, 0x5fe, 0x5fe})
	net/http/transport.go:2913 +0x13f
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp.(*wrappedBody).Read(0xc000796b80, {0xc000873202?, 0x0?, 0x0?})
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp@v0.56.0/transport.go:229 +0x2d
encoding/json.(*Decoder).refill(0xc000316b40)
	encoding/json/stream.go:165 +0x188
encoding/json.(*Decoder).readValue(0xc000316b40)
	encoding/json/stream.go:140 +0x85
encoding/json.(*Decoder).Decode(0xc000316b40, {0x23690c0, 0xc00070def0})
	encoding/json/stream.go:63 +0x75
github.com/docker/compose/v2/pkg/compose.(*composeService).pullServiceImage(_, {_, _}, {{0xc0006fb140, 0x11}, {0x0, 0x0, 0x0}, 0x0, 0x0, ...}, ...)
	github.com/docker/compose/v2/pkg/compose/pull.go:231 +0x4b0
github.com/docker/compose/v2/pkg/compose.(*composeService).pullRequiredImages.func1.1()
	github.com/docker/compose/v2/pkg/compose/pull.go:327 +0x170
golang.org/x/sync/errgroup.(*Group).Go.func1()
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:79 +0x50
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 61
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:76 +0x96

goroutine 234 [select]:
net/http.(*persistConn).writeLoop(0xc000a3fc20)
	net/http/transport.go:2519 +0xe7
created by net/http.(*Transport).dialConn in goroutine 313
	net/http/transport.go:1875 +0x15a5

goroutine 61 [semacquire]:
sync.runtime_Semacquire(0x1?)
	runtime/sema.go:71 +0x25
sync.(*WaitGroup).Wait(0xc000847920?)
	sync/waitgroup.go:118 +0x48
golang.org/x/sync/errgroup.(*Group).Wait(0xc0002cf340)
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:56 +0x25
github.com/docker/compose/v2/pkg/compose.(*composeService).pullRequiredImages.func1({0x2bba6c8, 0xc000847980})
	github.com/docker/compose/v2/pkg/compose/pull.go:340 +0x39b
github.com/docker/compose/v2/pkg/progress.Run.func1({0x2bba6c8?, 0xc000847980?})
	github.com/docker/compose/v2/pkg/progress/writer.go:62 +0x22
github.com/docker/compose/v2/pkg/progress.RunWithStatus.func2()
	github.com/docker/compose/v2/pkg/progress/writer.go:90 +0x70
golang.org/x/sync/errgroup.(*Group).Go.func1()
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:79 +0x50
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 13
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:76 +0x96

goroutine 73 [IO wait]:
internal/poll.runtime_pollWait(0x7b336857d540, 0x72)
	runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0xc000666200?, 0xc00066b000?, 0x0)
	internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
	internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000666200, {0xc00066b000, 0x1000, 0x1000})
	internal/poll/fd_unix.go:165 +0x27a
net.(*netFD).Read(0xc000666200, {0xc00066b000?, 0x0?, 0x2b915a0?})
	net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc000632010, {0xc00066b000?, 0x0?, 0x0?})
	net/net.go:189 +0x45
net/http.(*persistConn).Read(0xc000ac8000, {0xc00066b000?, 0x7841c5?, 0x23877c0?})
	net/http/transport.go:2052 +0x4a
bufio.(*Reader).fill(0xc000b84480)
	bufio/bufio.go:110 +0x103
bufio.(*Reader).Peek(0xc000b84480, 0x1)
	bufio/bufio.go:148 +0x53
net/http.(*persistConn).readLoop(0xc000ac8000)
	net/http/transport.go:2205 +0x185
created by net/http.(*Transport).dialConn in goroutine 258
	net/http/transport.go:1874 +0x154f

goroutine 205 [select]:
net/http.(*persistConn).writeLoop(0xc0008da240)
	net/http/transport.go:2519 +0xe7
created by net/http.(*Transport).dialConn in goroutine 149
	net/http/transport.go:1875 +0x15a5

goroutine 74 [select]:
net/http.(*persistConn).writeLoop(0xc000ac8000)
	net/http/transport.go:2519 +0xe7
created by net/http.(*Transport).dialConn in goroutine 258
	net/http/transport.go:1875 +0x15a5

goroutine 309 [IO wait]:
internal/poll.runtime_pollWait(0x7b33b7a95250, 0x72)
	runtime/netpoll.go:351 +0x85
internal/poll.(*pollDesc).wait(0xc000666500?, 0xc0009e3000?, 0x0)
	internal/poll/fd_poll_runtime.go:84 +0x27
internal/poll.(*pollDesc).waitRead(...)
	internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0xc000666500, {0xc0009e3000, 0x1000, 0x1000})
	internal/poll/fd_unix.go:165 +0x27a
net.(*netFD).Read(0xc000666500, {0xc0009e3000?, 0x0?, 0x0?})
	net/fd_posix.go:55 +0x25
net.(*conn).Read(0xc000632030, {0xc0009e3000?, 0x0?, 0xc00083a700?})
	net/net.go:189 +0x45
net/http.(*persistConn).Read(0xc000a3fc20, {0xc0009e3000?, 0x0?, 0x17?})
	net/http/transport.go:2052 +0x4a
bufio.(*Reader).fill(0xc000b84780)
	bufio/bufio.go:110 +0x103
bufio.(*Reader).ReadSlice(0xc000b84780, 0xa)
	bufio/bufio.go:376 +0x29
net/http/internal.readChunkLine(0x0?)
	net/http/internal/chunked.go:156 +0x1c
net/http/internal.(*chunkedReader).beginChunk(0xc0007e8c30)
	net/http/internal/chunked.go:49 +0x25
net/http/internal.(*chunkedReader).Read(0xc0007e8c30, {0xc000874602?, 0x0?, 0xc0007d4650?})
	net/http/internal/chunked.go:125 +0x131
net/http.(*body).readLocked(0xc000796e40, {0xc000874602?, 0xc0006e8680?, 0xc000194140?})
	net/http/transfer.go:844 +0x3b
net/http.(*body).Read(0x4?, {0xc000874602?, 0x224bc60?, 0x414b960?})
	net/http/transfer.go:836 +0x112
net/http.(*bodyEOFSignal).Read(0xc000796e80, {0xc000874602, 0x5fe, 0x5fe})
	net/http/transport.go:2913 +0x13f
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp.(*wrappedBody).Read(0xc000796f40, {0xc000874602?, 0x0?, 0x0?})
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp@v0.56.0/transport.go:229 +0x2d
encoding/json.(*Decoder).refill(0xc000316f00)
	encoding/json/stream.go:165 +0x188
encoding/json.(*Decoder).readValue(0xc000316f00)
	encoding/json/stream.go:140 +0x85
encoding/json.(*Decoder).Decode(0xc000316f00, {0x23690c0, 0xc0005a5ef0})
	encoding/json/stream.go:63 +0x75
github.com/docker/compose/v2/pkg/compose.(*composeService).pullServiceImage(_, {_, _}, {{0xc000340998, 0x8}, {0x0, 0x0, 0x0}, 0x0, 0x0, ...}, ...)
	github.com/docker/compose/v2/pkg/compose/pull.go:231 +0x4b0
github.com/docker/compose/v2/pkg/compose.(*composeService).pullRequiredImages.func1.1()
	github.com/docker/compose/v2/pkg/compose/pull.go:327 +0x170
golang.org/x/sync/errgroup.(*Group).Go.func1()
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:79 +0x50
created by golang.org/x/sync/errgroup.(*Group).Go in goroutine 61
	golang.org/x/sync@v0.13.0/errgroup/errgroup.go:76 +0x96

goroutine 265 [select]:
net/http.(*persistConn).readLoop(0xc000b46120)
	net/http/transport.go:2325 +0xca5
created by net/http.(*Transport).dialConn in goroutine 264
	net/http/transport.go:1874 +0x154f

goroutine 266 [select]:
net/http.(*persistConn).writeLoop(0xc000b46120)
	net/http/transport.go:2519 +0xe7
created by net/http.(*Transport).dialConn in goroutine 264
	net/http/transport.go:1875 +0x15a5
Error: Process completed with exit code 2.

Steps To Reproduce

Run docker compose --env-file ./config/.env.test up --remove-orphans --renew-anon-volumes --detach on a clean machine via self hosted Github action runner

Compose Version

ubuntu@ci-1:~$ docker compose version
Docker Compose version v2.35.1

Docker Environment

ubuntu@ci-1:~$ docker version
Client: Docker Engine - Community
 Version:           28.1.1
 API version:       1.49
 Go version:        go1.23.8
 Git commit:        4eba377
 Built:             Fri Apr 18 09:52:14 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          28.1.1
  API version:      1.49 (minimum version 1.24)
  Go version:       go1.23.8
  Git commit:       01f442b
  Built:            Fri Apr 18 09:52:14 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.27
  GitCommit:        05044ec0a9a75232cad458027ca83437aae3f4da
 runc:
  Version:          1.2.5
  GitCommit:        v1.2.5-0-g59923ef
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
ubuntu@ci-1:~$ 

Anything else?

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions