Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

attach: close streams when done #12112

Merged
merged 1 commit into from
Sep 10, 2024
Merged

Conversation

laurazard
Copy link
Member

What I did

When Compose is watching a project/reattaching streams on container start, it will make new API ContainerAttach() calls every time a container it's watching is started. However, it only closes the stream when the context used to start the attach is canceled.

This means that if a user has a project with multiple containers where containers keep restarting, Compose will attach to the new containers but never close the previous streams, causing fds to pile up and goroutines on the engine to get stuck.

You can verify this by using a Dockerfile such as:

FROM alpine:latest AS occupied

CMD ["sleep", "3600"]

FROM alpine:latest AS surplus

CMD ["sleep", "10"]

And the following Compose file:

services:
  occupied:
    image: container-used:latest
  
  surplus:
    restart: unless-stopped
    image: container-surplus:latest

Run

docker compose up --scale occupied=8 --scale surplus=2`.

In another terminal, run

watch -n1 "lsof -p `pgrep docker-compose` | grep unix"

And gradually watch the connections pile up.

(There might also be some bug engine-side here, I haven't looked into it yet.)

Related issue

fixes #12023

(not mandatory) A picture of a cute animal, if possible in relation to what you did

When Compose is watching a project/reattaching streams on container
start, it will make new API `ContainerAttach()` calls every time a
container it's watching is started. However, it only closes the stream
when the context used to start the attach is canceled.

This means that if a user has a project with multiple containers where
containers keep restarting, Compose will attach to the new containers
but never close the previous streams, causing fds to pile up and
goroutines on the engine to get stuck.

Signed-off-by: Laura Brehm <laurabrehm@hey.com>
@laurazard laurazard requested review from a team, ndeloof, glours and jhrotko and removed request for a team September 10, 2024 12:46
@laurazard laurazard self-assigned this Sep 10, 2024
Copy link
Contributor

@glours glours left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@glours glours enabled auto-merge (rebase) September 10, 2024 12:49
@glours glours merged commit 329ad73 into docker:main Sep 10, 2024
30 checks passed
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Sep 21, 2024
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [docker/compose](https://github.com/docker/compose) | patch | `v2.29.2` -> `v2.29.6` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>docker/compose (docker/compose)</summary>

### [`v2.29.6`](https://github.com/docker/compose/releases/tag/v2.29.6)

[Compare Source](docker/compose@v2.29.5...v2.29.6)

#### What's Changed

##### 🐛 Fixes

-   Don't set propagation if target engine isn't linux by [@&#8203;ndeloof](https://github.com/ndeloof) [(12138)](docker/compose#12138)

##### ⚙️ Dependencies

-   build(deps): bump docker, docker/cli to v27.3.0-rc.2 by [@&#8203;thaJeztah](https://github.com/thaJeztah) [(12136)](docker/compose#12136)

**Full Changelog**: docker/compose@v2.29.5...v2.29.6

### [`v2.29.5`](https://github.com/docker/compose/releases/tag/v2.29.5)

[Compare Source](docker/compose@v2.29.4...v2.29.5)

#### What's Changed

This release fix an issue with bind mounts on WSL2 when using Docker Desktop

##### 🐛 Fixes

-   Set propagation default by [@&#8203;ndeloof](https://github.com/ndeloof) [(12133)](docker/compose#12133)

##### 🔧  Internal

-   Remove custom codeql workflow in favor of default setup by [@&#8203;temenuzhka-thede](https://github.com/temenuzhka-thede) [(12131)](docker/compose#12131)

**Full Changelog**: docker/compose@v2.29.4...v2.29.5

### [`v2.29.4`](https://github.com/docker/compose/releases/tag/v2.29.4)

[Compare Source](docker/compose@v2.29.3...v2.29.4)

#### What's Changed

##### 🐛 Fixes

-   Fixed possible `nil` pointer dereference by [@&#8203;disc](https://github.com/disc) [(12127)](docker/compose#12127)
-   Stop dependent containers before recreating diverged service by [@&#8203;ndeloof](https://github.com/ndeloof) [(12122)](docker/compose#12122)

##### 🔧  Internal

-   GHA: test against docker engine v27.3.0 by [@&#8203;thaJeztah](https://github.com/thaJeztah) [(12126)](docker/compose#12126)
-   Chore(watch): Add debug log when skipping service without build context by [@&#8203;idsulik](https://github.com/idsulik) [(12067)](docker/compose#12067)

##### ⚙️ Dependencies

-   Build(deps): bump docker, docker/cli to v27.3.0-rc.1, buildx v0.17.1 by [@&#8203;thaJeztah](https://github.com/thaJeztah) [(12125)](docker/compose#12125)

#### New Contributors

-   [@&#8203;disc](https://github.com/disc) made their first contribution in docker/compose#12127

**Full Changelog**: docker/compose@v2.29.3...v2.29.4

### [`v2.29.3`](https://github.com/docker/compose/releases/tag/v2.29.3)

[Compare Source](docker/compose@v2.29.2...v2.29.3)

#### What's Changed

##### ✨ Improvements

-   Allow combination of bind mounts and 'rebuild' watches by [@&#8203;remcokranenburg](https://github.com/remcokranenburg) [(12089)](docker/compose#12089)

##### 🐛 Fixes

-   Fix(wait): Wait only until first container exit by [@&#8203;idsulik](https://github.com/idsulik)  [(12064)](docker/compose#12064)
-   Prefer mount API over bind by [@&#8203;ndeloof](https://github.com/ndeloof) [(12078)](docker/compose#12078)
-   Service hash must exclude depends_on by [@&#8203;ndeloof](https://github.com/ndeloof) [(12072)](docker/compose#12072)
-   Attach: close streams when done by [@&#8203;laurazard](https://github.com/laurazard) [(12112)](docker/compose#12112)
-   Restore compose v1 behavior to recreate containers when ran with `-V` by [@&#8203;ndeloof](https://github.com/ndeloof) [(12116)](docker/compose#12116)

##### 🔧  Internal

-   Allow to add empty line in the logs when nav menu activated by [@&#8203;glours](https://github.com/glours)  [(12062)](docker/compose#12062)
-   Docs: duplicate documentation for root cmd by [@&#8203;dvdksn](https://github.com/dvdksn) [(12076)](docker/compose#12076)
-   Fix typo in pull.go by [@&#8203;jonathan-dev](https://github.com/jonathan-dev) [(12108)](docker/compose#12108)
-   Use logrus instead of direct output to stderr by [@&#8203;felixfontein](https://github.com/felixfontein) [(11996)](docker/compose#11996)
-   Fix minor typos by [@&#8203;NathanBaulch](https://github.com/NathanBaulch) [(12104)](docker/compose#12104)
-   Chore(watch): Add changed file paths/count to log by [@&#8203;idsulik](https://github.com/idsulik) [(12118)](docker/compose#12118)

##### ⚙️ Dependencies

-   Build(deps): bump golang.org/x/sys from 0.22.0 to 0.25.0 by [@&#8203;dependabot](https://github.com/dependabot) [(12101)](docker/compose#12101)
-   Bump engine cli v27.2.1 by [@&#8203;glours](https://github.com/glours) [(12115)](docker/compose#12115)
-   Bump compose-go to version `v2.2.0` by [@&#8203;glours](https://github.com/glours) [(12117)](docker/compose#12117)
-   Build(deps): bump golang.org/x/sync from `0.7.0` to `0.8.0` by [@&#8203;dependabot](https://github.com/dependabot) [(12043)](docker/compose#12043)

#### New Contributors

-   [@&#8203;remcokranenburg](https://github.com/remcokranenburg) made their first contribution in [(12089)](docker/compose#12089)
-   [@&#8203;jonathan-dev](https://github.com/jonathan-dev) made their first contribution in [(12108)](docker/compose#12108)
-   [@&#8203;NathanBaulch](https://github.com/NathanBaulch) made their first contribution in [(12104)](docker/compose#12104)

**Full Changelog**: docker/compose@v2.29.2...v2.29.3

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BUG] docker-compose does not close unix socket with dockerd after container exits and restarts
3 participants