Docker.DotNet icon indicating copy to clipboard operation
Docker.DotNet copied to clipboard

How to attach to working container with Docker.DotNet

Open Alex-1357 opened this issue 3 years ago • 0 comments

One of important future to working with running container is attaching to running container with one command. Or with /bin/bash if we can attach interactively. So, this is command:

# sudo docker exec -it 7dde487b4424 bash
# sudo docker exec -it 7dde487b4424 pwd

Unfortunately, I can not found this command Docker.DotNet, some functions has similar name, but has no parameters like "bash command"

Public Interface IContainerOperations
    Function ListContainersAsync(parameters As ContainersListParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of IList(Of ContainerListResponse))
    Function ExtractArchiveToContainerAsync(id As String, parameters As ContainerPathStatParameters, stream As Stream, Optional cancellationToken As CancellationToken = Nothing) As Task
    Function GetArchiveFromContainerAsync(id As String, parameters As GetArchiveFromContainerParameters, statOnly As Boolean, Optional cancellationToken As CancellationToken = Nothing) As Task(Of GetArchiveFromContainerResponse)
    Function RemoveContainerAsync(id As String, parameters As ContainerRemoveParameters, Optional cancellationToken As CancellationToken = Nothing) As Task
    Function WaitContainerAsync(id As String, Optional cancellationToken As CancellationToken = Nothing) As Task(Of ContainerWaitResponse)
    Function AttachContainerAsync(id As String, tty As Boolean, parameters As ContainerAttachParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of MultiplexedStream)
    Function UnpauseContainerAsync(id As String, Optional cancellationToken As CancellationToken = Nothing) As Task
    Function PauseContainerAsync(id As String, Optional cancellationToken As CancellationToken = Nothing) As Task
    Function RenameContainerAsync(id As String, parameters As ContainerRenameParameters, cancellationToken As CancellationToken) As Task
    Function KillContainerAsync(id As String, parameters As ContainerKillParameters, Optional cancellationToken As CancellationToken = Nothing) As Task
    Function RestartContainerAsync(id As String, parameters As ContainerRestartParameters, Optional cancellationToken As CancellationToken = Nothing) As Task
    Function StopContainerAsync(id As String, parameters As ContainerStopParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of Boolean)
    Function StartContainerAsync(id As String, parameters As ContainerStartParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of Boolean)
    Function ResizeContainerTtyAsync(id As String, parameters As ContainerResizeParameters, Optional cancellationToken As CancellationToken = Nothing) As Task
    Function GetContainerStatsAsync(id As String, parameters As ContainerStatsParameters, progress As IProgress(Of ContainerStatsResponse), Optional cancellationToken As CancellationToken = Nothing) As Task
    <Obsolete("Use 'Task GetContainerStatsAsync(string id, ContainerStatsParameters parameters, CancellationToken cancellationToken, IProgress<JSONMessage> progress)'")>
    Function GetContainerStatsAsync(id As String, parameters As ContainerStatsParameters, cancellationToken As CancellationToken) As Task(Of Stream)
    Function ExportContainerAsync(id As String, Optional cancellationToken As CancellationToken = Nothing) As Task(Of Stream)
    Function InspectChangesAsync(id As String, Optional cancellationToken As CancellationToken = Nothing) As Task(Of IList(Of ContainerFileSystemChangeResponse))
    Function GetContainerLogsAsync(id As String, tty As Boolean, parameters As ContainerLogsParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of MultiplexedStream)
    Function GetContainerLogsAsync(id As String, parameters As ContainerLogsParameters, cancellationToken As CancellationToken, progress As IProgress(Of String)) As Task
    <Obsolete("The stream returned by this method won't be demultiplexed properly if the container was created without a TTY. Use GetContainerLogsAsync(string, bool, ContainerLogsParameters, CancellationToken) instead")>
    Function GetContainerLogsAsync(id As String, parameters As ContainerLogsParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of Stream)
    Function ListProcessesAsync(id As String, parameters As ContainerListProcessesParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of ContainerProcessesResponse)
    Function InspectContainerAsync(id As String, Optional cancellationToken As CancellationToken = Nothing) As Task(Of ContainerInspectResponse)
    Function CreateContainerAsync(parameters As CreateContainerParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of CreateContainerResponse)
    Function PruneContainersAsync(Optional parameters As ContainersPruneParameters = Nothing, Optional cancellationToken As CancellationToken = Nothing) As Task(Of ContainersPruneResponse)
    Function UpdateContainerAsync(id As String, parameters As ContainerUpdateParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of ContainerUpdateResponse)
End Interface

If we can see to exec interface

Public Interface IExecOperations
    Function ExecCreateContainerAsync(id As String, parameters As ContainerExecCreateParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of ContainerExecCreateResponse)
    Function StartContainerExecAsync(id As String, Optional cancellationToken As CancellationToken = Nothing) As Task
    Function StartAndAttachContainerExecAsync(id As String, tty As Boolean, Optional cancellationToken As CancellationToken = Nothing) As Task(Of MultiplexedStream)
    Function StartWithConfigContainerExecAsync(id As String, eConfig As ContainerExecStartParameters, Optional cancellationToken As CancellationToken = Nothing) As Task(Of MultiplexedStream)
    Function ResizeContainerExecTtyAsync(id As String, parameters As ContainerResizeParameters, Optional cancellationToken As CancellationToken = Nothing) As Task
    Function InspectContainerExecAsync(id As String, Optional cancellationToken As CancellationToken = Nothing) As Task(Of ContainerExecInspectResponse)
End Interface

We can see only two methods with CMD parameters - ExecCreateContainerAsync and StartWithConfigContainerExecAsync. I try to use it

        AttachToContainer(DockerHub, ContainerId, CMD, LogCtsSrc.Token)
        ReadContainerLog(DockerHub, ContainerId, Sub(X) Console.WriteLine(X), LogCtsSrc.Token)

        Function AttachToContainer(DockerHub As DockerClient, ContainerID As String, Cmd As IList(Of String), ExecCts As CancellationToken) As Task(Of ContainerExecCreateResponse)
            Dim ExecTask As Task(Of ContainerExecCreateResponse) = DockerHub.Exec.ExecCreateContainerAsync(ContainerID, New ContainerExecCreateParameters With {
                             .AttachStdin = False,
                             .AttachStderr = True,
                             .AttachStdout = True,
                             .Tty = False,
                             .Cmd = Cmd
                            },
                            ExecCts)
             Return ExecTask
         End Function

And receive nothing, only old part of container log instead response of my commands in CMD.

docker_01292022_115237-1

It's not looks as result of standard docker operation as

 # sudo docker exec -it 7dde487b4424 pwd

Alex-1357 avatar Jan 29 '22 18:01 Alex-1357