Я записываю данные из веб-браузера в интерактивный процесс (python) на docker через WebSocket и Docker SDK.
Данные: веб-браузер <-> Сервер <-> Docker (интерактивный процесс)
Я хочу получить вывод python. Например. ввод 1 + 1
, затем я хочу получить 2
.
Проблема в том, что я получаю первую возвращаемую строку (строка за строкой). В этом примере это
�Python 3.7.4 (default, Aug 13 2019, 20:35:49)
[GCC 7.3.0] :: Anaconda, Inc. on linux
import (
"fmt"
"github.com/gorilla/websocket"
"net/http")
var upgrader = websocket.Upgrader{}
func echo(w http.ResponseWriter, r *http.Request) {
upgrader.CheckOrigin = func(r *http.Request) bool { return true }
conn, err := upgrader.Upgrade(w, r, nil) // error ignored for sake of simplicity
if err != nil {
panic(err)
}
resp := StartRuntime([]string{"python"})
for {
// Read message from browser
msgType, msg, err := conn.ReadMessage()
if err != nil {
panic(err)
}
resp.Conn.Write(msg)
dockermsg, err := resp.Reader.ReadBytes(byte('\n')) <--I think I need to modify this line, but I am not sure how.
if err != nil {
panic(err)
}
fmt.Print(string(dockermsg))
err = conn.WriteMessage(msgType, dockermsg)
if err != nil {
panic(err)
}
}
}
func StartRuntime(cmd []string) types.HijackedResponse {
cli, ctx := getClient()
containerID := "9fba076ba45b0c29f8787ee0031ff12186a870461356e79da8fff8e3eaddc62d"
cli.ContainerStart(ctx, containerID, types.ContainerStartOptions{})
execID, _ := cli.ContainerExecCreate(ctx, containerID, types.ExecConfig{Cmd: cmd,
AttachStdin: true,
AttachStdout: true,
AttachStderr: true,
Tty: true})
resp := getResponse(execID.ID)
return resp
}
func getResponse(id string) types.HijackedResponse {
cli, ctx := getClient()
resp, err := cli.ContainerExecAttach(ctx, id, types.ExecStartCheck{})
if err != nil {
panic(err)
}
return resp
}