-
Notifications
You must be signed in to change notification settings - Fork 480
Add container attach/detach support #259
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
Conversation
Seeing some failures here. Moving back to draft until resolved. Will also rebase. |
This change introduces a new `container attach` command that allows users to attach to running containers with terminal support. - Move stdio management for interactive run from client to server so that sessions can exist beyond CLI lifetime. - Update stdio to use a ring buffer so attach can get recent history. - Enable legacy (client driven stdio) and server stdio coexistence. - Added `container attach <id>` subcommand for attaching to an existing session. - Added `--legacy-stdio` run flag to let newer clients talk to older servers. - Added `--detach-keys` option to run and attach to set detachment keys (defaulted to ctrl-p,ctrl-q) - Added integration tests for attach functionality - Added session management tests - Added fallback/legacy mode tests
Simplified some things and rebased. Added more integration tests and confirmed passing integration and unit tests. |
We haven't forgotten you 😄. Couple questions before I get started. What was the rationale behind needing to support sessions that exist past the lifetime of some attached client? Is that the entire reason behind swapping the direction that IO is established? The other thing I'm not sure of if we'd want to support as well is the ringbuffer of output before attaching. I haven't dug too far into it, but while the asking for the history is optional, it looks like if we ask for a pty we always fill the buffer? To me this feature is somewhat awkward as (and this is likely just me being used to other tools) I'd expect that if I was attaching I would solely be getting output from that point in time. We have |
😄
It's pretty common to start a container with a disconnected interactive terminal. I think that is why it is supported in docker. It allows one to separate container creation from exposing that terminal. We use it for starting interactive applications from remote clients without having to guarantee continuous remote connectivity. Think old school client/server. Could one reproduce similar by creating this on top of container by creating a secondary long-lived daemon to hold the sessions? Yes, but it creates a lot of additional complexity and you're basically replicating a bunch of container functionality.
Yeah, I considered both options. But the primary use case I think user expectation would be playback. Imagine starting an interactive detached container and then attaching to it a few seconds later. Do you expect to see what just happened? I suspect people would. The best analog would be screen. (I admit that It's nowhere near a perfect analog.) If you ran a command in screen and then detach then reattach, you don't lose context. One alt impl would be to internally invoke the log infra. The concern was the complexity of trying to split the stream correctly--e.g. ensuring exactly once semantics. That's what the ring buffer provides that I think would be invasive to add to the logs. |
I think I need to remember how IO was done here (I usually stay over in library land 😬) a tad more, but my remembrance was: We allocate 2 pipes (and 3 if -i was supplied) and send them to the daemon to use to send output to the client. However, the other bit I vaguely remember (you'd think I'd remember more as I added it..) output is always asked for from the process because we always write to a log file in addition to the pipes sent over by the client. This is how |
After a reworking of some types locally, I'm somewhat convinced server initiated stdio may be a blessing. I'll be looking at this tomorrow morning |
try ensureRunning(container: container) | ||
|
||
// Check if container has terminal enabled | ||
guard container.configuration.initProcess.terminal else { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why? If you just wanted to attach to see stdout/err really quick this shouldn't be required I'd imagine. Likewise even if you wanted to pipe some stdin I'd think you wouldn't need a pty
var noHistory = false | ||
|
||
@Option(name: .customLong("detach-keys"), help: "Override the key sequence for detaching a container") | ||
var detachKeys: String? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could not be happier about this 😆 I was honestly hoping someone would implement it.
One thing I can confidently say before reviewing the rest, I think we'd either want to move wholesale to server provided stdio or client and not a mix. I know you left in the old way so it's not an even bigger change/controversial, but we'd definitely just want one or the other. I'm honestly somewhat leaning towards the server end like I mentioned after trying to do a refactor the other day that was miserable, but I'll need to keep reading here and thinking about pitfalls |
Closing as not a priority. Others are free to pick up this code and start again if it becomes a priority. |
Closes #378.
Add container attach/detach support
This change introduces a new
container attach
command that allows users to attachto running containers with terminal support.
Key changes:
CLI Changes
container attach <id>
subcommand for attaching to an existing session.--legacy-stdio
run flag to let newer clients talk to older servers.--detach-keys
option to run and attach to set detachment keys (defaulted to ctrl-p,ctrl-q)Testing
Build changes
INTEGRATION_TEST_FILTER
,INTEGRATION_TEST_SKIP
,TEST_FILTER
--no-parallel