Commit 7f4ffa38 by chalermpong

add restart and pull

parent 010abfc8
{
"username": "your_username",
"password": "your_password",
"serveraddress": "harbor.nexpie.com",
"imageName": "harbor.nexpie.com/flowstack/mongo-gui:1.0.0-4"
}
...@@ -8,14 +8,8 @@ ...@@ -8,14 +8,8 @@
{ "containerPort": "8080", "hostPort": "9080" } { "containerPort": "8080", "hostPort": "9080" }
], ],
"volumes": [ "volumes": [
{ {"source": "/home/bakukan2008/npm","target": "/usr/src/app"},
"source": "/home/bakukan2008/npm", {"source": "/var/run/docker.sock","target": "/var/run/docker.sock"}
"target": "/usr/src/app"
},
{
"source": "/var/run/docker.sock",
"target": "/var/run/docker.sock"
}
], ],
"environment": [ "environment": [
{ {
......
const express = require('express'); const express = require('express');
const Docker = require('dockerode'); const Docker = require('dockerode');
const DockerodeCompose = require('dockerode-compose'); const DockerodeCompose = require('dockerode-compose');
const yaml = require('js-yaml');
const fs = require('fs');
const bodyParser = require('body-parser'); const bodyParser = require('body-parser');
const dockerCLI = require('docker-cli-js');
const DockerOptions = dockerCLI.Options;
const DockerCli = dockerCLI.Docker;
const app = express(); const app = express();
const docker = new Docker({socketPath: '/var/run/docker.sock'}); const docker = new Docker({socketPath: '/var/run/docker.sock'});
const dockerCli = new DockerCli();
// Middleware เพื่อตั้งค่า HTTP headers เพื่อรับ JSON // Middleware เพื่อตั้งค่า HTTP headers เพื่อรับ JSON
app.use(express.json()); app.use(express.json());
app.use(express.urlencoded({ extended: true })); app.use(express.urlencoded({ extended: true }));
app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true }));
app.post('/api/docker/login', (req, res) => {
const { username, password } = req.body;
// กำหนดคำสั่ง login
const loginCommand = `login -u ${username} -p ${password}`;
// ทำการ login
dockerCli.command(loginCommand).then(data => {
console.log('Login สำเร็จ:', data);
res.status(200).json({ message: 'Login สำเร็จ' });
}).catch(err => {
console.error('เกิดข้อผิดพลาดในการ login:', err);
res.status(500).json({ error: 'เกิดข้อผิดพลาดในการ login' });
});
});
app.post('/api/docker/pull', async (req, res) => { app.use(bodyParser.json());
try {
const { imageName } = req.body;
if (!imageName) {
return res.status(400).json({ error: 'กรุณาระบุชื่อของ Docker image' });
}
const stream = await docker.pull(imageName);
stream.on('data', (chunk) => { app.post('/api/docker/pull', (req, res) => {
const data = JSON.parse(chunk.toString());
console.log(data); // Log progress data (optional)
});
stream.on('end', () => { const auth = {
console.log(`เสร็จสิ้นการดึง Docker image: ${imageName}`); username: req.body.username,
res.status(200).json({ message: `เสร็จสิ้นการดึง Docker image: ${imageName}` }); password: req.body.password,
}); auth: '',
// email: req.body.email,
serveraddress: req.body.serveraddress
};
} catch (error) {
console.error('เกิดข้อผิดพลาดในการดึง Docker image:', error);
res.status(500).json({ error: 'เกิดข้อผิดพลาดในการดึง Docker image' });
}
});
app.post('/api/docker/pull-image', async (req, res) => { const imageName = req.body.imageName;
const { imageName } = req.body;
// ตรวจสอบว่าชื่อ Docker image ถูกส่งมาหรือไม่
if (!imageName) {
return res.status(400).json({ error: 'กรุณาระบุชื่อ Docker image' });
}
// ตรวจสอบว่าชื่อ Docker image เป็น remote หรือไม่ docker.pull(imageName, { authconfig: auth }, (err, stream) => {
docker.getImage(imageName).inspect((err, data) => {
if (err) { if (err) {
console.error('เกิดข้อผิดพลาดในการตรวจสอบ Docker image:', err); console.error('เกิดข้อผิดพลาดในการ pull image:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการตรวจสอบ Docker image' }); return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการ pull image' });
} }
// ถ้า Docker image เป็น remote image // ดึงข้อมูลจาก stream
if (data && data.RepoTags) { docker.modem.followProgress(stream, onFinished, onProgress);
console.log('Docker image เป็น remote image');
// ดึง Docker image จาก remote repository function onFinished(err, output) {
docker.pull(imageName, (err, stream) => {
if (err) { if (err) {
console.error('เกิดข้อผิดพลาดในการดึง Docker image:', err); console.error('เกิดข้อผิดพลาดในการดึงข้อมูล:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการดึง Docker image' }); return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการดึงข้อมูล' });
}
console.log('การ pull image เสร็จสิ้น:', output);
res.status(200).json({ message: 'การ pull image เสร็จสิ้น' });
} }
// ติดตามความคืบหน้าของการดึง Docker image function onProgress(event) {
docker.modem.followProgress(stream, (err, output) => { console.log('การดึงข้อมูล:', event);
if (err) {
console.error('เกิดข้อผิดพลาดในการติดตามความคืบหน้า:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการติดตามความคืบหน้า' });
} }
console.log('การดึง Docker image เสร็จสมบูรณ์');
return res.status(200).json({ message: 'การดึง Docker image เสร็จสมบูรณ์' });
});
}); });
} else {
console.log('Docker image เป็น local image');
return res.status(400).json({ error: 'Docker image เป็น local image' });
}
}); });
});
app.get('/api/docker/images', async (req, res) => { app.get('/api/docker/images', async (req, res) => {
try { try {
...@@ -407,6 +353,38 @@ app.post('/api/docker-compose/down', async (req, res) => { ...@@ -407,6 +353,38 @@ app.post('/api/docker-compose/down', async (req, res) => {
} }
}); });
// API endpoint สำหรับ restart containers
app.post('/api/docker/restart', (req, res) => {
const containerIds = req.body.containerIds;
if (!containerIds || !Array.isArray(containerIds) || containerIds.length === 0) {
return res.status(400).json({ error: 'กรุณาระบุรายการ container IDs ให้ถูกต้องและไม่ว่างเปล่า' });
}
const promises = containerIds.map(containerId => {
const container = docker.getContainer(containerId);
return new Promise((resolve, reject) => {
container.restart((err) => {
if (err) {
console.error(`เกิดข้อผิดพลาดในการ restart container ${containerId}:`, err);
reject(`เกิดข้อผิดพลาดในการ restart container ${containerId}`);
} else {
console.log(`Container ${containerId} ถูก restart สำเร็จ`);
resolve(`Container ${containerId} ถูก restart สำเร็จ`);
}
});
});
});
Promise.all(promises)
.then(results => {
res.status(200).json({ message: 'การ restart containers เสร็จสิ้น', results: results });
})
.catch(error => {
res.status(500).json({ error: 'เกิดข้อผิดพลาดในการ restart containers', details: error });
});
});
// เริ่มต้นเซิร์ฟเวอร์ // เริ่มต้นเซิร์ฟเวอร์
const port = process.env.PORT || 3200; const port = process.env.PORT || 3200;
......
// var dockerCLI = require('docker-cli-js'); const express = require('express');
// var DockerOptions = dockerCLI.Options; const Docker = require('dockerode');
// var DockerCli = dockerCLI.Docker; const bodyParser = require('body-parser');
const app = express();
const docker = new Docker();
// var dockerCli = new DockerCli(); // Middleware เพื่อรับ JSON และ urlencoded data
// const username = 'myusername'; app.use(express.json());
// const password = 'mypassword'; app.use(express.urlencoded({ extended: true }));
app.use(bodyParser.json());
// const loginCommand = `login -u ${username} -p ${password}`; // Route POST /api/docker/login
app.post('/api/docker/pull', (req, res) => {
const { username, password, email, imageName } = req.body;
// // ทำการ login // สร้าง auth object
// dockerCli.command(loginCommand).then(data => { const auth = {
// console.log('Login สำเร็จ:', data); username: username,
// }).catch(err => { password: password,
// console.error('เกิดข้อผิดพลาดในการ login:', err); email: email,
// }); serveraddress: 'harbor.nexpie.com'
};
const Docker = require('dockerode'); // ทำการ authenticate
const docker = new Docker(); docker.auth.create(auth, (err, result) => {
docker.listImages((err, images) => {
if (err) { if (err) {
console.error('เกิดข้อผิดพลาดในการดึงรายการ Docker images:', err); console.error('เกิดข้อผิดพลาดในการ authenticate:', err);
} else { return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการ authenticate' });
console.log('รายการ Docker images ทั้งหมด:', images);
// ตรวจสอบว่า Docker image ที่ต้องการอยู่ใน Repository หรือไม่
const imageName = 'harbor.nexpie.com/flowstack/mongo-gui:1.0.0-4';
const imageExists = images.some(image => image.RepoTags.includes(imageName));
if (imageExists) {
console.log(`Docker image '${imageName}' อยู่ใน Repository`);
} else {
console.log(`Docker image '${imageName}' ไม่อยู่ใน Repository`);
} }
// ทำการ pull image พร้อมกับการ authenticate
docker.pull(imageName, { authconfig: { username: username, password: password } }, (err, stream) => {
if (err) {
console.error('เกิดข้อผิดพลาดในการ pull image:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการ pull image' });
} }
// ดึงข้อมูลจาก stream
docker.modem.followProgress(stream, onFinished, onProgress);
function onFinished(err, output) {
if (err) {
console.error('เกิดข้อผิดพลาดในการดึงข้อมูล:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการดึงข้อมูล' });
}
console.log('การ pull image เสร็จสิ้น:', output);
res.status(200).json({ message: 'การ pull image เสร็จสิ้น' });
}
function onProgress(event) {
console.log('การดึงข้อมูล:', event);
}
});
}); });
});
// เริ่มต้น Express server ที่ port 3000
app.listen(3200, () => {
console.log('Server is running on port 3000');
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment