Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
dockerode
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chalermpong
dockerode
Commits
7f4ffa38
Commit
7f4ffa38
authored
Apr 24, 2024
by
chalermpong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add restart and pull
parent
010abfc8
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
136 additions
and
132 deletions
+136
-132
Models/Schema-docker-pull.json
+6
-0
Models/Schema-start-compose.json
+4
-9
app.js
+69
-91
dockerode.js
+57
-32
No files found.
Models/Schema-docker-pull.json
0 → 100644
View file @
7f4ffa38
{
"username"
:
"your_username"
,
"password"
:
"your_password"
,
"serveraddress"
:
"harbor.nexpie.com"
,
"imageName"
:
"harbor.nexpie.com/flowstack/mongo-gui:1.0.0-4"
}
Models/Schema-start-compose.json
View file @
7f4ffa38
...
...
@@ -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"
:
[
{
...
...
@@ -72,4 +66,4 @@
}
}
]
}
}
\ No newline at end of file
app.js
View file @
7f4ffa38
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
.
post
(
'/api/docker/pull'
,
async
(
req
,
res
)
=>
{
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
)
=>
{
const
data
=
JSON
.
parse
(
chunk
.
toString
());
console
.
log
(
data
);
// Log progress data (optional)
});
app
.
use
(
bodyParser
.
urlencoded
({
extended
:
true
}));
stream
.
on
(
'end'
,
()
=>
{
console
.
log
(
`เสร็จสิ้นการดึง Docker image:
${
imageName
}
`
);
res
.
status
(
200
).
json
({
message
:
`เสร็จสิ้นการดึง Docker image:
${
imageName
}
`
});
});
}
catch
(
error
)
{
console
.
error
(
'เกิดข้อผิดพลาดในการดึง Docker image:'
,
error
);
res
.
status
(
500
).
json
({
error
:
'เกิดข้อผิดพลาดในการดึง Docker image'
});
}
});
app
.
use
(
bodyParser
.
json
());
app
.
post
(
'/api/docker/pull-image'
,
async
(
req
,
res
)
=>
{
const
{
imageName
}
=
req
.
body
;
// ตรวจสอบว่าชื่อ Docker image ถูกส่งมาหรือไม่
if
(
!
imageName
)
{
return
res
.
status
(
400
).
json
({
error
:
'กรุณาระบุชื่อ Docker image'
});
}
// ตรวจสอบว่าชื่อ Docker image เป็น remote หรือไม่
docker
.
getImage
(
imageName
).
inspect
((
err
,
data
)
=>
{
app
.
post
(
'/api/docker/pull'
,
(
req
,
res
)
=>
{
const
auth
=
{
username
:
req
.
body
.
username
,
password
:
req
.
body
.
password
,
auth
:
''
,
// email: req.body.email,
serveraddress
:
req
.
body
.
serveraddress
};
const
imageName
=
req
.
body
.
imageName
;
docker
.
pull
(
imageName
,
{
authconfig
:
auth
},
(
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
(
'เกิดข้อผิดพลาดในการตรวจสอบ Docker image:'
,
err
);
return
res
.
status
(
500
).
json
({
error
:
'เกิดข้อผิดพลาดในการตรวจสอบ Docker image'
});
}
// ถ้า Docker image เป็น remote image
if
(
data
&&
data
.
RepoTags
)
{
console
.
log
(
'Docker image เป็น remote image'
);
// ดึง Docker image จาก remote repository
docker
.
pull
(
imageName
,
(
err
,
stream
)
=>
{
if
(
err
)
{
console
.
error
(
'เกิดข้อผิดพลาดในการดึง Docker image:'
,
err
);
return
res
.
status
(
500
).
json
({
error
:
'เกิดข้อผิดพลาดในการดึง Docker image'
});
}
// ติดตามความคืบหน้าของการดึง Docker image
docker
.
modem
.
followProgress
(
stream
,
(
err
,
output
)
=>
{
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'
});
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
);
}
});
});
});
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
;
...
...
dockerode.js
View file @
7f4ffa38
// var dockerCLI = require('docker-cli-j
s');
// var DockerOptions = dockerCLI.Options
;
// var DockerCli = dockerCLI.Docker
;
const
express
=
require
(
'expres
s'
);
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
)
=>
{
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`
);
}
}
});
\ No newline at end of file
// ทำการ authenticate
docker
.
auth
.
create
(
auth
,
(
err
,
result
)
=>
{
if
(
err
)
{
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'
);
});
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment