以下是我目前正在处理的文件:
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”等命令。
您是否按照 Socket.IO 入门页面上的说明进行操作? Express 是一个 HTTP 服务器,您应该至少有一个映射,例如 Web 服务器的主页,例如:
app.get('/', (req, res) => {
res.send('<h1>Hello world</h1>');
});
或者您的文件夹中是否有
public/index.html
文件?
此命令返回什么:
curl -i http://localhost:3000/