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 @@
{ "containerPort": "8080", "hostPort": "9080" }
],
"volumes": [
{
"source": "/home/bakukan2008/npm",
"target": "/usr/src/app"
},
{
"source": "/var/run/docker.sock",
"target": "/var/run/docker.sock"
}
{"source": "/home/bakukan2008/npm","target": "/usr/src/app"},
{"source": "/var/run/docker.sock","target": "/var/run/docker.sock"}
],
"environment": [
{
......
const express = require('express');
const Docker = require('dockerode');
const DockerodeCompose = require('dockerode-compose');
const yaml = require('js-yaml');
const fs = require('fs');
const bodyParser = require('body-parser');
const dockerCLI = require('docker-cli-js');
const DockerOptions = dockerCLI.Options;
const DockerCli = dockerCLI.Docker;
const app = express();
const docker = new Docker({socketPath: '/var/run/docker.sock'});
const dockerCli = new DockerCli();
// Middleware เพื่อตั้งค่า HTTP headers เพื่อรับ JSON
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(bodyParser.json());
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.use(bodyParser.urlencoded({ extended: true }));
app.post('/api/docker/pull', async (req, res) => {
try {
const { imageName } = req.body;
app.use(bodyParser.json());
if (!imageName) {
return res.status(400).json({ error: 'กรุณาระบุชื่อของ Docker image' });
}
const stream = await docker.pull(imageName);
stream.on('data', (chunk) => {
const data = JSON.parse(chunk.toString());
console.log(data); // Log progress data (optional)
});
app.post('/api/docker/pull', (req, res) => {
stream.on('end', () => {
console.log(`เสร็จสิ้นการดึง Docker image: ${imageName}`);
res.status(200).json({ message: `เสร็จสิ้นการดึง Docker image: ${imageName}` });
});
const auth = {
username: req.body.username,
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;
const imageName = req.body.imageName;
// ตรวจสอบว่าชื่อ Docker image ถูกส่งมาหรือไม่
if (!imageName) {
return res.status(400).json({ error: 'กรุณาระบุชื่อ Docker image' });
}
// ตรวจสอบว่าชื่อ Docker image เป็น remote หรือไม่
docker.getImage(imageName).inspect((err, data) => {
docker.pull(imageName, { authconfig: auth }, (err, stream) => {
if (err) {
console.error('เกิดข้อผิดพลาดในการตรวจสอบ Docker image:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการตรวจสอบ Docker image' });
console.error('เกิดข้อผิดพลาดในการ pull image:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการ pull image' });
}
// ถ้า Docker image เป็น remote image
if (data && data.RepoTags) {
console.log('Docker image เป็น remote image');
// ดึงข้อมูลจาก stream
docker.modem.followProgress(stream, onFinished, onProgress);
// ดึง Docker image จาก remote repository
docker.pull(imageName, (err, stream) => {
function onFinished(err, output) {
if (err) {
console.error('เกิดข้อผิดพลาดในการดึง Docker image:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการดึง Docker image' });
console.error('เกิดข้อผิดพลาดในการดึงข้อมูล:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการดึงข้อมูล' });
}
console.log('การ pull image เสร็จสิ้น:', output);
res.status(200).json({ message: 'การ pull image เสร็จสิ้น' });
}
// ติดตามความคืบหน้าของการดึง Docker image
docker.modem.followProgress(stream, (err, output) => {
if (err) {
console.error('เกิดข้อผิดพลาดในการติดตามความคืบหน้า:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการติดตามความคืบหน้า' });
function onProgress(event) {
console.log('การดึงข้อมูล:', event);
}
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) => {
try {
......@@ -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;
......
// var dockerCLI = require('docker-cli-js');
// var DockerOptions = dockerCLI.Options;
// var DockerCli = dockerCLI.Docker;
const express = require('express');
const Docker = require('dockerode');
const bodyParser = require('body-parser');
const app = express();
const docker = new Docker();
// var dockerCli = new DockerCli();
// const username = 'myusername';
// const password = 'mypassword';
// Middleware เพื่อรับ JSON และ urlencoded data
app.use(express.json());
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
// dockerCli.command(loginCommand).then(data => {
// console.log('Login สำเร็จ:', data);
// }).catch(err => {
// console.error('เกิดข้อผิดพลาดในการ login:', err);
// });
// สร้าง auth object
const auth = {
username: username,
password: password,
email: email,
serveraddress: 'harbor.nexpie.com'
};
const Docker = require('dockerode');
const docker = new Docker();
docker.listImages((err, images) => {
// ทำการ authenticate
docker.auth.create(auth, (err, result) => {
if (err) {
console.error('เกิดข้อผิดพลาดในการดึงรายการ Docker images:', err);
} else {
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`);
console.error('เกิดข้อผิดพลาดในการ authenticate:', err);
return res.status(500).json({ error: 'เกิดข้อผิดพลาดในการ authenticate' });
}
// ทำการ 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