我无法使用nodeJS和websocket将docker容器与我的Web终端连接

问题描述 投票:0回答:1

以下是我目前正在处理的文件:

const express = require('express');
const http = require('http');
const { Server } = require("socket.io");
const Docker = require('dockerode');
const docker = new Docker({ socketPath: '/var/run/docker.sock' });

const app = express();
const server = http.createServer(app);
const io = new Server(server);

app.use(express.static('public'));

io.on('connection', (socket) => {
    console.log('A user connected');

    docker.createContainer({
        Image: 'ubuntu',
        Cmd: ['/bin/bash'],
        AttachStdin: true,
        AttachStdout: true,
        AttachStderr: true,
        Tty: true,
        OpenStdin: true
    }).then(container => {
        return container.start().then(() => {
            return container.attach({
                stream: true,
                stdin: true,
                stdout: true,
                stderr: true
            });
        }).then(stream => {
            container.modem.demuxStream(stream, socket, socket);
            stream.on('end', () => {
                socket.emit('disconnect');
                container.remove();
            });

            socket.on('data', (data) => {
                stream.write(data);
            });
        });
    }).catch(err => {
        console.error(err);
    });

    socket.on('disconnect', () => {
        console.log('User disconnected');
    });
});

const port = 3000;
server.listen(port, () => console.log(`Server running on port ${port}`));

我查了很多资料,甚至问过chatGPT,但还是无法解决问题。

问题是,当用户转到

localhost:3000
时,nodejs 可以创建一个容器,但我无法在 Web 终端中输入命令。

我尝试打印用户在网络终端中输入的内容,尽管网络终端没有显示任何内容。事实上,它获取了用户输入的命令。

我希望这个文件允许用户访问 localhost:3000 并为自己创建一个新容器。另外,我希望 Web 终端提供一个交互式界面,可以运行“top”和“vim”等命令。

node.js docker websocket pty
1个回答
0
投票

您是否按照 Socket.IO 入门页面上的说明进行操作? Express 是一个 HTTP 服务器,您应该至少有一个映射,例如 Web 服务器的主页,例如:

app.get('/', (req, res) => {
  res.send('<h1>Hello world</h1>');
});

或者您的文件夹中是否有

public/index.html
文件?

此命令返回什么:

curl -i http://localhost:3000/

© www.soinside.com 2019 - 2024. All rights reserved.