Skip to content
This repository has been archived by the owner on Feb 13, 2021. It is now read-only.

The legacy Docker backend for ContainerSSH

License

Notifications You must be signed in to change notification settings

ContainerSSH/dockerrun

Repository files navigation

ContainerSSH - Launch Containers on Demand

⚠ The DockerRun Backend is deprecated! ⚠

Go Report Card LGTM Alerts

This backend is no longer maintained and replaced by the docker backend. Please see the deprecation notice for details.

This library implements a backend that connects to a Docker socket and launches a new container for each connection, then runs executes a separate command per channel.

⚠⚠⚠ Warning: This is a developer documentation. ⚠⚠⚠
The user documentation for ContainerSSH is located at containerssh.io.

Using this library

This library implements a NetworkConnectionHandler from the sshserver library. This can be embedded into a connection handler.

The network connection handler can be created with the New() method:

var client net.TCPAddr
connectionID := "0123456789ABCDEF"
config := dockerrun.Config{
    //...
}
dr, err := dockerrun.New(client, connectionID, config, logger)
if err != nil {
    // Handle error
}

The logger parameter is a logger from the ContainerSSH logger library.

The dr variable can then be used to create a container on finished handshake:

ssh, err := dr.OnHandshakeSuccess("provided-connection-username")

Conversely, on disconnect you must call dr.OnDisconnect(). The ssh variable can then be used to create session channels:

var channelID uint64 = 0
extraData := []byte{}
session, err := ssh.OnSessionChannel(channelID, extraData)

Finally, the session can be used to launch programs:

var requestID uint64 = 0
err = session.OnEnvRequest(requestID, "foo", "bar")
// ...
requestID = 1
var stdin io.Reader
var stdout, stderr io.Writer
err = session.OnShell(
    requestID,
    stdin,
    stdout,
    stderr,
    func(exitStatus ExitStatus) {
        // ...
    },
)