detached 42939eb

WIP

commit
42939ebecd81a4c0ce0a6f7bda25139af62411c5
author
bnema · · 2023-09-04 16:38 UTC
parent
8b1a07a
signature
unsigned
8 files · +248 -129
M .gitignore +2 -3
@@ -1,5 +1,4 @@
11 .env
22 node_modules/
3-tmp/
4-logs/
5-*.log⏎̸
3+tmp/*
4+logs/*⏎̸
@@ -1,5 +1,4 @@
1 .env1 .env
2 node_modules/2 node_modules/
3-tmp/3+tmp/*
4-logs/4+logs/*⏎̸
5-*.log⏎̸
M cmd/main.go +2 -1
@@ -25,7 +25,7 @@ func main() {
2525 return
2626 }
2727
28- docker.ListDocker() // List docker containers
28+ docker.CreateImageFromDockerfile()
2929
3030 e := echo.New()
3131 e.HideBanner = true
@@ -38,4 +38,5 @@ func main() {
3838 return e.Start(":" + port)
3939 }
4040 utils.RunAppCatchSIGINT(startFunc, &gordon.APPLogger.Logger)
41+
4142 }
@@ -25,7 +25,7 @@ func main() {
25 return25 return
26 }26 }
27 27
28- docker.ListDocker() // List docker containers28+ docker.CreateImageFromDockerfile()
29 29
30 e := echo.New()30 e := echo.New()
31 e.HideBanner = true31 e.HideBanner = true
@@ -38,4 +38,5 @@ func main() {
38 return e.Start(":" + port)38 return e.Start(":" + port)
39 }39 }
40 utils.RunAppCatchSIGINT(startFunc, &gordon.APPLogger.Logger)40 utils.RunAppCatchSIGINT(startFunc, &gordon.APPLogger.Logger)
41+
41 }42 }
M go.mod +12 -3
@@ -11,18 +11,27 @@ require (
1111 require (
1212 github.com/Microsoft/go-winio v0.6.1 // indirect
1313 github.com/andybalholm/cascadia v1.3.1 // indirect
14+ github.com/containerd/containerd v1.7.5 // indirect
1415 github.com/docker/distribution v2.8.2+incompatible // indirect
1516 github.com/docker/docker v24.0.5+incompatible // indirect
1617 github.com/docker/go-connections v0.4.0 // indirect
1718 github.com/docker/go-units v0.5.0 // indirect
1819 github.com/gogo/protobuf v1.3.2 // indirect
1920 github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
21+ github.com/klauspost/compress v1.16.7 // indirect
22+ github.com/moby/patternmatcher v0.6.0 // indirect
23+ github.com/moby/sys/sequential v0.5.0 // indirect
2024 github.com/opencontainers/go-digest v1.0.0 // indirect
21- github.com/opencontainers/image-spec v1.0.2 // indirect
25+ github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b // indirect
26+ github.com/opencontainers/runc v1.1.9 // indirect
2227 github.com/pkg/errors v0.9.1 // indirect
23- golang.org/x/mod v0.8.0 // indirect
28+ github.com/sirupsen/logrus v1.9.0 // indirect
29+ github.com/tidwall/gjson v1.16.0 // indirect
30+ github.com/tidwall/match v1.1.1 // indirect
31+ github.com/tidwall/pretty v1.2.1 // indirect
32+ golang.org/x/mod v0.9.0 // indirect
2433 golang.org/x/time v0.3.0 // indirect
25- golang.org/x/tools v0.6.0 // indirect
34+ golang.org/x/tools v0.7.0 // indirect
2635 )
2736
2837 require (
@@ -11,18 +11,27 @@ require (
11 require (11 require (
12 github.com/Microsoft/go-winio v0.6.1 // indirect12 github.com/Microsoft/go-winio v0.6.1 // indirect
13 github.com/andybalholm/cascadia v1.3.1 // indirect13 github.com/andybalholm/cascadia v1.3.1 // indirect
14+ github.com/containerd/containerd v1.7.5 // indirect
14 github.com/docker/distribution v2.8.2+incompatible // indirect15 github.com/docker/distribution v2.8.2+incompatible // indirect
15 github.com/docker/docker v24.0.5+incompatible // indirect16 github.com/docker/docker v24.0.5+incompatible // indirect
16 github.com/docker/go-connections v0.4.0 // indirect17 github.com/docker/go-connections v0.4.0 // indirect
17 github.com/docker/go-units v0.5.0 // indirect18 github.com/docker/go-units v0.5.0 // indirect
18 github.com/gogo/protobuf v1.3.2 // indirect19 github.com/gogo/protobuf v1.3.2 // indirect
19 github.com/golang-jwt/jwt v3.2.2+incompatible // indirect20 github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
21+ github.com/klauspost/compress v1.16.7 // indirect
22+ github.com/moby/patternmatcher v0.6.0 // indirect
23+ github.com/moby/sys/sequential v0.5.0 // indirect
20 github.com/opencontainers/go-digest v1.0.0 // indirect24 github.com/opencontainers/go-digest v1.0.0 // indirect
21- github.com/opencontainers/image-spec v1.0.2 // indirect25+ github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b // indirect
26+ github.com/opencontainers/runc v1.1.9 // indirect
22 github.com/pkg/errors v0.9.1 // indirect27 github.com/pkg/errors v0.9.1 // indirect
23- golang.org/x/mod v0.8.0 // indirect28+ github.com/sirupsen/logrus v1.9.0 // indirect
29+ github.com/tidwall/gjson v1.16.0 // indirect
30+ github.com/tidwall/match v1.1.1 // indirect
31+ github.com/tidwall/pretty v1.2.1 // indirect
32+ golang.org/x/mod v0.9.0 // indirect
24 golang.org/x/time v0.3.0 // indirect33 golang.org/x/time v0.3.0 // indirect
25- golang.org/x/tools v0.6.0 // indirect34+ golang.org/x/tools v0.7.0 // indirect
26 )35 )
27 36
28 require (37 require (
M go.sum +27 -0 generated file: collapsed
M logs/app.log +69 -50
@@ -1,50 +1,69 @@
1-{"level":"info","time":"2023-09-04T11:58:38+02:00","message":"Logger initialized directly after setup in app.go"}
2-{"level":"info","time":"2023-09-04T11:58:38+02:00","message":"Middlewares have been registered!"}
3-{"level":"info","time":"2023-09-04T12:03:03+02:00","message":"Logger initialized directly after setup in app.go"}
4-{"level":"info","time":"2023-09-04T12:03:03+02:00","message":"Middlewares have been registered!"}
5-{"level":"info","time":"2023-09-04T12:06:57+02:00","message":"Middlewares have been registered!"}
6-{"level":"info","time":"2023-09-04T12:06:57+02:00","message":"Server is listening on port 1323"}
7-{"level":"info","time":"2023-09-04T12:12:05+02:00","message":"Middlewares have been registered!"}
8-{"level":"info","time":"2023-09-04T12:12:05+02:00","message":"Server is listening on port 1323"}
9-{"level":"info","time":"2023-09-04T12:16:03+02:00","message":"Middlewares have been registered!"}
10-{"level":"info","time":"2023-09-04T12:16:03+02:00","message":"Server is listening on port 1323"}
11-{"level":"warn","time":"2023-09-04T12:16:41+02:00","message":"Graceful shutdown initiated, server will shutdown in 5 seconds"}
12-{"level":"info","time":"2023-09-04T12:16:46+02:00","message":"Server shutdown"}
13-{"level":"info","time":"2023-09-04T12:19:53+02:00","message":"Server is listening on port 1323"}
14-{"level":"info","time":"2023-09-04T12:19:54+02:00","message":"Graceful shutdown initiated"}
15-{"level":"warn","time":"2023-09-04T12:19:54+02:00","message":"Server will shutdown in 5 seconds press any key to cancel"}
16-{"level":"info","time":"2023-09-04T12:19:59+02:00","message":"Server shutdown"}
17-{"level":"info","time":"2023-09-04T12:21:28+02:00","message":"Server is listening on port 1323"}
18-{"level":"info","time":"2023-09-04T12:21:31+02:00","message":"Graceful shutdown initiated"}
19-{"level":"warn","time":"2023-09-04T12:21:31+02:00","message":"Server will shutdown in 5 seconds press any key to cancel"}
20-{"level":"info","time":"2023-09-04T12:21:36+02:00","message":"Server shutdown"}
21-{"level":"info","time":"2023-09-04T12:23:49+02:00","message":"Server is listening on port 1323"}
22-{"level":"info","time":"2023-09-04T12:23:51+02:00","message":"Graceful shutdown initiated"}
23-{"level":"warn","time":"2023-09-04T12:23:51+02:00","message":"Server will shutdown in 5 seconds press any key to cancel"}
24-{"level":"info","time":"2023-09-04T12:23:54+02:00","message":"Shutdown cancelled by user"}
25-{"level":"info","time":"2023-09-04T12:24:40+02:00","message":"Server is listening on port 1323"}
26-{"level":"info","time":"2023-09-04T12:39:06+02:00","message":"Server is listening on port 1323"}
27-{"level":"info","time":"2023-09-04T12:40:11+02:00","message":"Server is listening on port 1323"}
28-{"level":"warn","time":"2023-09-04T12:40:12+02:00","message":"Graceful shutdown initiated"}
29-{"level":"warn","time":"2023-09-04T12:40:12+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
30-{"level":"info","time":"2023-09-04T12:40:17+02:00","message":"Server shutdown"}
31-{"level":"info","time":"2023-09-04T14:05:05+02:00","message":"Server is listening on port 1323"}
32-{"level":"info","time":"2023-09-04T14:05:15+02:00","message":"Server is listening on port 1323"}
33-{"level":"info","time":"2023-09-04T14:39:43+02:00","message":"Server is listening on port 1323"}
34-{"level":"info","time":"2023-09-04T14:39:43+02:00","message":"Server is listening on port 1323"}
35-{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T14:39:43+02:00","message":"Failed to start the server"}
36-{"level":"info","time":"2023-09-04T14:42:19+02:00","message":"Server is listening on port 1323"}
37-{"level":"info","time":"2023-09-04T14:42:19+02:00","message":"Server is listening on port 1323"}
38-{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T14:42:19+02:00","message":"Failed to start the server"}
39-{"level":"info","time":"2023-09-04T14:45:00+02:00","message":"Server is listening on port 1323"}
40-{"level":"info","time":"2023-09-04T14:45:00+02:00","message":"Server is listening on port 1323"}
41-{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T14:45:00+02:00","message":"Failed to start the server"}
42-{"level":"info","time":"2023-09-04T14:50:37+02:00","message":"Server is listening on port 1323"}
43-{"level":"info","time":"2023-09-04T14:50:37+02:00","message":"Server is listening on port 1323"}
44-{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T14:50:37+02:00","message":"Failed to start the server"}
45-{"level":"info","time":"2023-09-04T14:50:51+02:00","message":"Server is listening on port 1323"}
46-{"level":"info","time":"2023-09-04T14:51:08+02:00","message":"Server is listening on port 1323"}
47-{"level":"warn","time":"2023-09-04T14:51:10+02:00","message":"Graceful shutdown initiated"}
48-{"level":"warn","time":"2023-09-04T14:51:10+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
49-{"level":"info","time":"2023-09-04T14:51:15+02:00","message":"Server shutdown"}
50-{"level":"info","time":"2023-09-04T17:18:16+02:00","message":"Server is listening on port 1323"}
1+{"level":"info","time":"2023-09-04T17:22:20+02:00","message":"Server is listening on port 1323"}
2+{"level":"warn","time":"2023-09-04T17:27:06+02:00","message":"Graceful shutdown initiated"}
3+{"level":"warn","time":"2023-09-04T17:27:06+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
4+{"level":"info","time":"2023-09-04T17:27:06+02:00","message":"Shutdown cancelled by user"}
5+{"level":"info","time":"2023-09-04T17:27:12+02:00","message":"Server is listening on port 1323"}
6+{"level":"warn","time":"2023-09-04T17:30:20+02:00","message":"Graceful shutdown initiated"}
7+{"level":"warn","time":"2023-09-04T17:30:20+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
8+{"level":"info","time":"2023-09-04T17:30:21+02:00","message":"Shutdown cancelled by user"}
9+{"level":"info","time":"2023-09-04T17:30:26+02:00","message":"Starting to list Docker containers..."}
10+{"level":"info","time":"2023-09-04T17:30:26+02:00","message":"Starting Docker client..."}
11+{"level":"info","time":"2023-09-04T17:30:26+02:00","message":"Starting Docker client..."}
12+,"time":"2023-09-04T17:30:26+02:00","message":"Listing Docker containers..."}
13+{"level":"info","time":"2023-09-04T17:30:26+02:00","message":"Finished listing Docker containers."}
14+{"level":"info","time":"2023-09-04T17:30:26+02:00","message":"Server is listening on port 1323"}
15+{"level":"warn","time":"2023-09-04T17:32:37+02:00","message":"Graceful shutdown initiated"}
16+{"level":"warn","time":"2023-09-04T17:32:37+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
17+{"level":"info","time":"2023-09-04T17:32:42+02:00","message":"Server shutdown"}
18+{"level":"info","time":"2023-09-04T17:33:12+02:00","message":"Starting to list Docker containers..."}
19+{"level":"info","time":"2023-09-04T17:33:12+02:00","message":"Starting Docker client..."}
20+{"level":"info","time":"2023-09-04T17:33:12+02:00","message":"Starting Docker client..."}
21+,"time":"2023-09-04T17:33:12+02:00","message":"Listing Docker containers..."}
22+{"level":"info","time":"2023-09-04T17:33:12+02:00","message":"Finished listing Docker containers."}
23+{"level":"info","time":"2023-09-04T17:33:12+02:00","message":"Server is listening on port 1323"}
24+{"level":"warn","time":"2023-09-04T17:37:16+02:00","message":"Graceful shutdown initiated"}
25+{"level":"warn","time":"2023-09-04T17:37:16+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
26+{"level":"info","time":"2023-09-04T17:37:21+02:00","message":"Server shutdown"}
27+{"level":"info","time":"2023-09-04T17:38:24+02:00","message":"Server is listening on port 1323"}
28+{"level":"warn","time":"2023-09-04T17:41:08+02:00","message":"Graceful shutdown initiated"}
29+{"level":"warn","time":"2023-09-04T17:41:08+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
30+{"level":"info","time":"2023-09-04T17:41:08+02:00","message":"Shutdown cancelled by user"}
31+{"level":"info","time":"2023-09-04T17:41:18+02:00","message":"Server is listening on port 1323"}
32+{"level":"warn","time":"2023-09-04T17:41:48+02:00","message":"Graceful shutdown initiated"}
33+{"level":"warn","time":"2023-09-04T17:41:48+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
34+{"level":"info","time":"2023-09-04T17:41:53+02:00","message":"Server shutdown"}
35+{"level":"info","time":"2023-09-04T17:41:57+02:00","message":"Server is listening on port 1323"}
36+{"level":"info","time":"2023-09-04T17:43:29+02:00","message":"Server is listening on port 1323"}
37+{"level":"info","time":"2023-09-04T17:44:23+02:00","message":"Server is listening on port 1323"}
38+{"level":"info","time":"2023-09-04T17:44:23+02:00","message":"Server is listening on port 1323"}
39+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T17:44:23+02:00","message":"Failed to start the server"}
40+{"level":"info","time":"2023-09-04T17:45:14+02:00","message":"Server is listening on port 1323"}
41+{"level":"info","time":"2023-09-04T17:45:14+02:00","message":"Server is listening on port 1323"}
42+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T17:45:14+02:00","message":"Failed to start the server"}
43+{"level":"info","time":"2023-09-04T17:46:57+02:00","message":"Server is listening on port 1323"}
44+{"level":"info","time":"2023-09-04T17:49:28+02:00","message":"Server is listening on port 1323"}
45+{"level":"info","time":"2023-09-04T17:49:28+02:00","message":"Server is listening on port 1323"}
46+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T17:49:28+02:00","message":"Failed to start the server"}
47+{"level":"info","time":"2023-09-04T17:53:19+02:00","message":"Server is listening on port 1323"}
48+{"level":"info","time":"2023-09-04T17:53:34+02:00","message":"Server is listening on port 1323"}
49+{"level":"info","time":"2023-09-04T17:53:34+02:00","message":"Server is listening on port 1323"}
50+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T17:53:34+02:00","message":"Failed to start the server"}
51+{"level":"info","time":"2023-09-04T17:54:26+02:00","message":"Server is listening on port 1323"}
52+{"level":"info","time":"2023-09-04T17:54:26+02:00","message":"Server is listening on port 1323"}
53+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T17:54:26+02:00","message":"Failed to start the server"}
54+{"level":"info","time":"2023-09-04T18:07:59+02:00","message":"Server is listening on port 1323"}
55+{"level":"info","time":"2023-09-04T18:07:59+02:00","message":"Server is listening on port 1323"}
56+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T18:07:59+02:00","message":"Failed to start the server"}
57+{"level":"info","time":"2023-09-04T18:15:34+02:00","message":"Server is listening on port 1323"}
58+{"level":"info","time":"2023-09-04T18:15:34+02:00","message":"Server is listening on port 1323"}
59+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T18:15:34+02:00","message":"Failed to start the server"}
60+{"level":"info","time":"2023-09-04T18:35:05+02:00","message":"Server is listening on port 1323"}
61+{"level":"info","time":"2023-09-04T18:35:11+02:00","message":"Server is listening on port 1323"}
62+{"level":"info","time":"2023-09-04T18:35:11+02:00","message":"Server is listening on port 1323"}
63+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T18:35:11+02:00","message":"Failed to start the server"}
64+{"level":"info","time":"2023-09-04T18:35:50+02:00","message":"Server is listening on port 1323"}
65+{"level":"info","time":"2023-09-04T18:35:50+02:00","message":"Server is listening on port 1323"}
66+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T18:35:50+02:00","message":"Failed to start the server"}
67+{"level":"info","time":"2023-09-04T18:36:13+02:00","message":"Server is listening on port 1323"}
68+{"level":"info","time":"2023-09-04T18:36:13+02:00","message":"Server is listening on port 1323"}
69+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T18:36:13+02:00","message":"Failed to start the server"}
@@ -1,50 +1,69 @@
1-{"level":"info","time":"2023-09-04T11:58:38+02:00","message":"Logger initialized directly after setup in app.go"}1+{"level":"info","time":"2023-09-04T17:22:20+02:00","message":"Server is listening on port 1323"}
2-{"level":"info","time":"2023-09-04T11:58:38+02:00","message":"Middlewares have been registered!"}2+{"level":"warn","time":"2023-09-04T17:27:06+02:00","message":"Graceful shutdown initiated"}
3-{"level":"info","time":"2023-09-04T12:03:03+02:00","message":"Logger initialized directly after setup in app.go"}3+{"level":"warn","time":"2023-09-04T17:27:06+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
4-{"level":"info","time":"2023-09-04T12:03:03+02:00","message":"Middlewares have been registered!"}4+{"level":"info","time":"2023-09-04T17:27:06+02:00","message":"Shutdown cancelled by user"}
5-{"level":"info","time":"2023-09-04T12:06:57+02:00","message":"Middlewares have been registered!"}5+{"level":"info","time":"2023-09-04T17:27:12+02:00","message":"Server is listening on port 1323"}
6-{"level":"info","time":"2023-09-04T12:06:57+02:00","message":"Server is listening on port 1323"}6+{"level":"warn","time":"2023-09-04T17:30:20+02:00","message":"Graceful shutdown initiated"}
7-{"level":"info","time":"2023-09-04T12:12:05+02:00","message":"Middlewares have been registered!"}7+{"level":"warn","time":"2023-09-04T17:30:20+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
8-{"level":"info","time":"2023-09-04T12:12:05+02:00","message":"Server is listening on port 1323"}8+{"level":"info","time":"2023-09-04T17:30:21+02:00","message":"Shutdown cancelled by user"}
9-{"level":"info","time":"2023-09-04T12:16:03+02:00","message":"Middlewares have been registered!"}9+{"level":"info","time":"2023-09-04T17:30:26+02:00","message":"Starting to list Docker containers..."}
10-{"level":"info","time":"2023-09-04T12:16:03+02:00","message":"Server is listening on port 1323"}10+{"level":"info","time":"2023-09-04T17:30:26+02:00","message":"Starting Docker client..."}
11-{"level":"warn","time":"2023-09-04T12:16:41+02:00","message":"Graceful shutdown initiated, server will shutdown in 5 seconds"}11+{"level":"info","time":"2023-09-04T17:30:26+02:00","message":"Starting Docker client..."}
12-{"level":"info","time":"2023-09-04T12:16:46+02:00","message":"Server shutdown"}12+,"time":"2023-09-04T17:30:26+02:00","message":"Listing Docker containers..."}
13-{"level":"info","time":"2023-09-04T12:19:53+02:00","message":"Server is listening on port 1323"}13+{"level":"info","time":"2023-09-04T17:30:26+02:00","message":"Finished listing Docker containers."}
14-{"level":"info","time":"2023-09-04T12:19:54+02:00","message":"Graceful shutdown initiated"}14+{"level":"info","time":"2023-09-04T17:30:26+02:00","message":"Server is listening on port 1323"}
15-{"level":"warn","time":"2023-09-04T12:19:54+02:00","message":"Server will shutdown in 5 seconds press any key to cancel"}15+{"level":"warn","time":"2023-09-04T17:32:37+02:00","message":"Graceful shutdown initiated"}
16-{"level":"info","time":"2023-09-04T12:19:59+02:00","message":"Server shutdown"}16+{"level":"warn","time":"2023-09-04T17:32:37+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
17-{"level":"info","time":"2023-09-04T12:21:28+02:00","message":"Server is listening on port 1323"}17+{"level":"info","time":"2023-09-04T17:32:42+02:00","message":"Server shutdown"}
18-{"level":"info","time":"2023-09-04T12:21:31+02:00","message":"Graceful shutdown initiated"}18+{"level":"info","time":"2023-09-04T17:33:12+02:00","message":"Starting to list Docker containers..."}
19-{"level":"warn","time":"2023-09-04T12:21:31+02:00","message":"Server will shutdown in 5 seconds press any key to cancel"}19+{"level":"info","time":"2023-09-04T17:33:12+02:00","message":"Starting Docker client..."}
20-{"level":"info","time":"2023-09-04T12:21:36+02:00","message":"Server shutdown"}20+{"level":"info","time":"2023-09-04T17:33:12+02:00","message":"Starting Docker client..."}
21-{"level":"info","time":"2023-09-04T12:23:49+02:00","message":"Server is listening on port 1323"}21+,"time":"2023-09-04T17:33:12+02:00","message":"Listing Docker containers..."}
22-{"level":"info","time":"2023-09-04T12:23:51+02:00","message":"Graceful shutdown initiated"}22+{"level":"info","time":"2023-09-04T17:33:12+02:00","message":"Finished listing Docker containers."}
23-{"level":"warn","time":"2023-09-04T12:23:51+02:00","message":"Server will shutdown in 5 seconds press any key to cancel"}23+{"level":"info","time":"2023-09-04T17:33:12+02:00","message":"Server is listening on port 1323"}
24-{"level":"info","time":"2023-09-04T12:23:54+02:00","message":"Shutdown cancelled by user"}24+{"level":"warn","time":"2023-09-04T17:37:16+02:00","message":"Graceful shutdown initiated"}
25-{"level":"info","time":"2023-09-04T12:24:40+02:00","message":"Server is listening on port 1323"}25+{"level":"warn","time":"2023-09-04T17:37:16+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
26-{"level":"info","time":"2023-09-04T12:39:06+02:00","message":"Server is listening on port 1323"}26+{"level":"info","time":"2023-09-04T17:37:21+02:00","message":"Server shutdown"}
27-{"level":"info","time":"2023-09-04T12:40:11+02:00","message":"Server is listening on port 1323"}27+{"level":"info","time":"2023-09-04T17:38:24+02:00","message":"Server is listening on port 1323"}
28-{"level":"warn","time":"2023-09-04T12:40:12+02:00","message":"Graceful shutdown initiated"}28+{"level":"warn","time":"2023-09-04T17:41:08+02:00","message":"Graceful shutdown initiated"}
29-{"level":"warn","time":"2023-09-04T12:40:12+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}29+{"level":"warn","time":"2023-09-04T17:41:08+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
30-{"level":"info","time":"2023-09-04T12:40:17+02:00","message":"Server shutdown"}30+{"level":"info","time":"2023-09-04T17:41:08+02:00","message":"Shutdown cancelled by user"}
31-{"level":"info","time":"2023-09-04T14:05:05+02:00","message":"Server is listening on port 1323"}31+{"level":"info","time":"2023-09-04T17:41:18+02:00","message":"Server is listening on port 1323"}
32-{"level":"info","time":"2023-09-04T14:05:15+02:00","message":"Server is listening on port 1323"}32+{"level":"warn","time":"2023-09-04T17:41:48+02:00","message":"Graceful shutdown initiated"}
33-{"level":"info","time":"2023-09-04T14:39:43+02:00","message":"Server is listening on port 1323"}33+{"level":"warn","time":"2023-09-04T17:41:48+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}
34-{"level":"info","time":"2023-09-04T14:39:43+02:00","message":"Server is listening on port 1323"}34+{"level":"info","time":"2023-09-04T17:41:53+02:00","message":"Server shutdown"}
35-{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T14:39:43+02:00","message":"Failed to start the server"}35+{"level":"info","time":"2023-09-04T17:41:57+02:00","message":"Server is listening on port 1323"}
36-{"level":"info","time":"2023-09-04T14:42:19+02:00","message":"Server is listening on port 1323"}36+{"level":"info","time":"2023-09-04T17:43:29+02:00","message":"Server is listening on port 1323"}
37-{"level":"info","time":"2023-09-04T14:42:19+02:00","message":"Server is listening on port 1323"}37+{"level":"info","time":"2023-09-04T17:44:23+02:00","message":"Server is listening on port 1323"}
38-{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T14:42:19+02:00","message":"Failed to start the server"}38+{"level":"info","time":"2023-09-04T17:44:23+02:00","message":"Server is listening on port 1323"}
39-{"level":"info","time":"2023-09-04T14:45:00+02:00","message":"Server is listening on port 1323"}39+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T17:44:23+02:00","message":"Failed to start the server"}
40-{"level":"info","time":"2023-09-04T14:45:00+02:00","message":"Server is listening on port 1323"}40+{"level":"info","time":"2023-09-04T17:45:14+02:00","message":"Server is listening on port 1323"}
41-{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T14:45:00+02:00","message":"Failed to start the server"}41+{"level":"info","time":"2023-09-04T17:45:14+02:00","message":"Server is listening on port 1323"}
42-{"level":"info","time":"2023-09-04T14:50:37+02:00","message":"Server is listening on port 1323"}42+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T17:45:14+02:00","message":"Failed to start the server"}
43-{"level":"info","time":"2023-09-04T14:50:37+02:00","message":"Server is listening on port 1323"}43+{"level":"info","time":"2023-09-04T17:46:57+02:00","message":"Server is listening on port 1323"}
44-{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T14:50:37+02:00","message":"Failed to start the server"}44+{"level":"info","time":"2023-09-04T17:49:28+02:00","message":"Server is listening on port 1323"}
45-{"level":"info","time":"2023-09-04T14:50:51+02:00","message":"Server is listening on port 1323"}45+{"level":"info","time":"2023-09-04T17:49:28+02:00","message":"Server is listening on port 1323"}
46-{"level":"info","time":"2023-09-04T14:51:08+02:00","message":"Server is listening on port 1323"}46+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T17:49:28+02:00","message":"Failed to start the server"}
47-{"level":"warn","time":"2023-09-04T14:51:10+02:00","message":"Graceful shutdown initiated"}47+{"level":"info","time":"2023-09-04T17:53:19+02:00","message":"Server is listening on port 1323"}
48-{"level":"warn","time":"2023-09-04T14:51:10+02:00","message":"Server will shutdown in 5 seconds press ENTER to cancel"}48+{"level":"info","time":"2023-09-04T17:53:34+02:00","message":"Server is listening on port 1323"}
49-{"level":"info","time":"2023-09-04T14:51:15+02:00","message":"Server shutdown"}49+{"level":"info","time":"2023-09-04T17:53:34+02:00","message":"Server is listening on port 1323"}
50-{"level":"info","time":"2023-09-04T17:18:16+02:00","message":"Server is listening on port 1323"}50+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T17:53:34+02:00","message":"Failed to start the server"}
51+{"level":"info","time":"2023-09-04T17:54:26+02:00","message":"Server is listening on port 1323"}
52+{"level":"info","time":"2023-09-04T17:54:26+02:00","message":"Server is listening on port 1323"}
53+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T17:54:26+02:00","message":"Failed to start the server"}
54+{"level":"info","time":"2023-09-04T18:07:59+02:00","message":"Server is listening on port 1323"}
55+{"level":"info","time":"2023-09-04T18:07:59+02:00","message":"Server is listening on port 1323"}
56+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T18:07:59+02:00","message":"Failed to start the server"}
57+{"level":"info","time":"2023-09-04T18:15:34+02:00","message":"Server is listening on port 1323"}
58+{"level":"info","time":"2023-09-04T18:15:34+02:00","message":"Server is listening on port 1323"}
59+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T18:15:34+02:00","message":"Failed to start the server"}
60+{"level":"info","time":"2023-09-04T18:35:05+02:00","message":"Server is listening on port 1323"}
61+{"level":"info","time":"2023-09-04T18:35:11+02:00","message":"Server is listening on port 1323"}
62+{"level":"info","time":"2023-09-04T18:35:11+02:00","message":"Server is listening on port 1323"}
63+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T18:35:11+02:00","message":"Failed to start the server"}
64+{"level":"info","time":"2023-09-04T18:35:50+02:00","message":"Server is listening on port 1323"}
65+{"level":"info","time":"2023-09-04T18:35:50+02:00","message":"Server is listening on port 1323"}
66+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T18:35:50+02:00","message":"Failed to start the server"}
67+{"level":"info","time":"2023-09-04T18:36:13+02:00","message":"Server is listening on port 1323"}
68+{"level":"info","time":"2023-09-04T18:36:13+02:00","message":"Server is listening on port 1323"}
69+{"level":"fatal","error":"listen tcp :1323: bind: address already in use","time":"2023-09-04T18:36:13+02:00","message":"Failed to start the server"}
M logs/http.log +9 -67
@@ -1,67 +1,9 @@
1-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}
2-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T11:57:03+02:00","message":"request"}
3-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}
4-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}
5-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}
6-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}
7-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}
8-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}
9-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}
10-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/favicon.ico","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}
11-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
12-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T11:57:48+02:00","message":"request"}
13-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
14-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
15-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
16-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
17-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
18-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
19-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
20-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/favicon.ico","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
21-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T14:05:22+02:00","message":"request"}
22-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T14:05:23+02:00","message":"request"}
23-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
24-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T14:05:25+02:00","message":"request"}
25-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
26-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
27-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
28-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
29-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
30-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
31-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
32-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/favicon.ico","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
33-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
34-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
35-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
36-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
37-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
38-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T14:31:47+02:00","message":"request"}
39-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
40-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
41-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
42-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/favicon.ico","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
43-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:22+02:00","message":"request"}
44-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:32:22+02:00","message":"request"}
45-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:42+02:00","message":"request"}
46-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:42+02:00","message":"request"}
47-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:32:42+02:00","message":"request"}
48-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:46+02:00","message":"request"}
49-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:47+02:00","message":"request"}
50-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:32:47+02:00","message":"request"}
51-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:48+02:00","message":"request"}
52-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:49+02:00","message":"request"}
53-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:32:49+02:00","message":"request"}
54-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:53+02:00","message":"request"}
55-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:54+02:00","message":"request"}
56-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:32:54+02:00","message":"request"}
57-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:55+02:00","message":"request"}
58-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T14:33:13+02:00","message":"request"}
59-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T14:33:13+02:00","message":"request"}
60-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T14:33:13+02:00","message":"request"}
61-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T14:33:13+02:00","message":"request"}
62-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
63-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
64-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
65-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
66-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
67-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/favicon.ico","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
1+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
2+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T17:22:23+02:00","message":"request"}
3+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
4+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
5+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
6+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
7+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
8+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
9+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
@@ -1,67 +1,9 @@
1-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}1+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
2-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T11:57:03+02:00","message":"request"}2+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T17:22:23+02:00","message":"request"}
3-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}3+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
4-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}4+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
5-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}5+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
6-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}6+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
7-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}7+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
8-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}8+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
9-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}9+{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T17:22:23+02:00","message":"request"}
10-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/favicon.ico","status":200,"time":"2023-09-04T11:57:03+02:00","message":"request"}
11-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
12-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T11:57:48+02:00","message":"request"}
13-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
14-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
15-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
16-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
17-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
18-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
19-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
20-{"level":"info","type":"http","remote_ip":"::1","method":"GET","URI":"/favicon.ico","status":200,"time":"2023-09-04T11:57:48+02:00","message":"request"}
21-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T14:05:22+02:00","message":"request"}
22-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T14:05:23+02:00","message":"request"}
23-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
24-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T14:05:25+02:00","message":"request"}
25-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
26-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
27-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
28-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
29-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
30-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
31-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
32-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/favicon.ico","status":200,"time":"2023-09-04T14:05:25+02:00","message":"request"}
33-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
34-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
35-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
36-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
37-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
38-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T14:31:47+02:00","message":"request"}
39-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
40-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
41-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
42-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/favicon.ico","status":200,"time":"2023-09-04T14:31:47+02:00","message":"request"}
43-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:22+02:00","message":"request"}
44-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:32:22+02:00","message":"request"}
45-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:42+02:00","message":"request"}
46-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:42+02:00","message":"request"}
47-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:32:42+02:00","message":"request"}
48-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:46+02:00","message":"request"}
49-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:47+02:00","message":"request"}
50-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:32:47+02:00","message":"request"}
51-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:48+02:00","message":"request"}
52-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:49+02:00","message":"request"}
53-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:32:49+02:00","message":"request"}
54-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:53+02:00","message":"request"}
55-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:54+02:00","message":"request"}
56-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:32:54+02:00","message":"request"}
57-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:32:55+02:00","message":"request"}
58-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/admin","status":200,"time":"2023-09-04T14:33:13+02:00","message":"request"}
59-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/css/tailwind.css","status":200,"time":"2023-09-04T14:33:13+02:00","message":"request"}
60-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/iconoir.css","status":200,"time":"2023-09-04T14:33:13+02:00","message":"request"}
61-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/js/custom.js","status":404,"time":"2023-09-04T14:33:13+02:00","message":"request"}
62-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/alpine.min.js","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
63-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/libs/htmx.min.js","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
64-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/LilitaOne/LilitaOne-Regular.ttf","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
65-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/fonts/IBMPlex/IBMPlexSans-Regular.woff2","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
66-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/assets/imgs/gordon-mascot-hq-trsp.png","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
67-{"level":"info","type":"http","remote_ip":"127.0.0.1","method":"GET","URI":"/favicon.ico","status":200,"time":"2023-09-04T14:33:14+02:00","message":"request"}
M pkg/docker/registry.go +106 -5
@@ -3,24 +3,125 @@ package docker
33 import (
44 "context"
55 "fmt"
6+ "io"
7+ "os"
68
79 "github.com/docker/docker/api/types"
10+ "github.com/docker/docker/api/types/container"
811 "github.com/docker/docker/client"
12+ "github.com/docker/docker/pkg/archive"
13+ "github.com/docker/docker/pkg/stdcopy"
914 )
1015
11-// basic list of containers and images
12-func ListDocker() {
13- cli, err := client.NewClientWithOpts(client.FromEnv)
16+func DockertPullImageTest() {
17+ ctx := context.Background()
18+ cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
1419 if err != nil {
1520 panic(err)
1621 }
22+ defer cli.Close()
1723
18- containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
24+ reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{})
1925 if err != nil {
2026 panic(err)
2127 }
28+ io.Copy(os.Stdout, reader)
29+
30+ resp, err := cli.ContainerCreate(ctx, &container.Config{
31+ Image: "alpine",
32+ Cmd: []string{"echo", "hello world"},
33+ }, nil, nil, nil, "")
34+ if err != nil {
35+ panic(err)
36+ }
37+
38+ if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
39+ panic(err)
40+ }
41+
42+ statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning)
43+ select {
44+ case err := <-errCh:
45+ if err != nil {
46+ panic(err)
47+ }
48+ case <-statusCh:
49+ }
50+
51+ out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
52+ if err != nil {
53+ panic(err)
54+ }
55+
56+ stdcopy.StdCopy(os.Stdout, os.Stderr, out)
57+}
58+
59+func DockerListContainersTest() {
60+ fmt.Println("Executing DockerListContainersTest()")
61+
62+ ctx := context.Background()
63+ cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
64+ if err != nil {
65+ panic(err)
66+ }
67+ defer cli.Close()
68+
69+ fmt.Println("Initialized Docker client.")
70+
71+ containers, err := cli.ContainerList(ctx, types.ContainerListOptions{All: true})
72+ if err != nil {
73+ panic(err)
74+ }
75+
76+ fmt.Printf("Found %d containers.\n", len(containers))
2277
2378 for _, container := range containers {
24- fmt.Printf("%s %s\n", container.ID[:10], container.Image)
79+ fmt.Printf("%s %s\n", container.ID[:10], container.Status)
80+ }
81+}
82+
83+// I have a Dockerfile inside tmp/docker-test/Dockerfile and i want to create an image from it and place it at the same directory.
84+func CreateImageFromDockerfile() {
85+ fmt.Println("Executing CreateImageFromDockerfile()")
86+ fmt.Println("Initialized Docker client.")
87+ ctx := context.Background()
88+ cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
89+ if err != nil {
90+ panic(err)
91+ }
92+ defer cli.Close()
93+
94+ fmt.Println("Building image...")
95+ buildCtx, err := archive.TarWithOptions("tmp/docker-test/", &archive.TarOptions{})
96+ if err != nil {
97+ panic(err)
98+ }
99+ defer buildCtx.Close()
100+
101+ fmt.Println("Building image...")
102+ imageBuildResponse, err := cli.ImageBuild(ctx, buildCtx, types.ImageBuildOptions{
103+ Tags: []string{"gordon-echo:latest"},
104+ })
105+ if err != nil {
106+ panic(err)
107+ }
108+ defer imageBuildResponse.Body.Close()
109+
110+ fmt.Println("Saving image to file...")
111+
112+ imageTar, err := cli.ImageSave(ctx, []string{"gordon-echo:latest"})
113+ if err != nil {
114+ panic(err)
115+ }
116+
117+ outputFile, err := os.Create("tmp/docker-test/gordon-echo.tar")
118+ if err != nil {
119+ panic(err)
120+ }
121+ defer outputFile.Close()
122+
123+ _, err = io.Copy(outputFile, imageTar)
124+ if err != nil {
125+ panic(err)
25126 }
26127 }
@@ -3,24 +3,125 @@ package docker
3 import (3 import (
4 "context"4 "context"
5 "fmt"5 "fmt"
6+ "io"
7+ "os"
6 8
7 "github.com/docker/docker/api/types"9 "github.com/docker/docker/api/types"
10+ "github.com/docker/docker/api/types/container"
8 "github.com/docker/docker/client"11 "github.com/docker/docker/client"
12+ "github.com/docker/docker/pkg/archive"
13+ "github.com/docker/docker/pkg/stdcopy"
9 )14 )
10 15
11-// basic list of containers and images16+func DockertPullImageTest() {
12-func ListDocker() {17+ ctx := context.Background()
13- cli, err := client.NewClientWithOpts(client.FromEnv)18+ cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
14 if err != nil {19 if err != nil {
15 panic(err)20 panic(err)
16 }21 }
22+ defer cli.Close()
17 23
18- containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})24+ reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{})
19 if err != nil {25 if err != nil {
20 panic(err)26 panic(err)
21 }27 }
28+ io.Copy(os.Stdout, reader)
29+
30+ resp, err := cli.ContainerCreate(ctx, &container.Config{
31+ Image: "alpine",
32+ Cmd: []string{"echo", "hello world"},
33+ }, nil, nil, nil, "")
34+ if err != nil {
35+ panic(err)
36+ }
37+
38+ if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
39+ panic(err)
40+ }
41+
42+ statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning)
43+ select {
44+ case err := <-errCh:
45+ if err != nil {
46+ panic(err)
47+ }
48+ case <-statusCh:
49+ }
50+
51+ out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
52+ if err != nil {
53+ panic(err)
54+ }
55+
56+ stdcopy.StdCopy(os.Stdout, os.Stderr, out)
57+}
58+
59+func DockerListContainersTest() {
60+ fmt.Println("Executing DockerListContainersTest()")
61+
62+ ctx := context.Background()
63+ cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
64+ if err != nil {
65+ panic(err)
66+ }
67+ defer cli.Close()
68+
69+ fmt.Println("Initialized Docker client.")
70+
71+ containers, err := cli.ContainerList(ctx, types.ContainerListOptions{All: true})
72+ if err != nil {
73+ panic(err)
74+ }
75+
76+ fmt.Printf("Found %d containers.\n", len(containers))
22 77
23 for _, container := range containers {78 for _, container := range containers {
24- fmt.Printf("%s %s\n", container.ID[:10], container.Image)79+ fmt.Printf("%s %s\n", container.ID[:10], container.Status)
80+ }
81+}
82+
83+// I have a Dockerfile inside tmp/docker-test/Dockerfile and i want to create an image from it and place it at the same directory.
84+func CreateImageFromDockerfile() {
85+ fmt.Println("Executing CreateImageFromDockerfile()")
86+ fmt.Println("Initialized Docker client.")
87+ ctx := context.Background()
88+ cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
89+ if err != nil {
90+ panic(err)
91+ }
92+ defer cli.Close()
93+
94+ fmt.Println("Building image...")
95+ buildCtx, err := archive.TarWithOptions("tmp/docker-test/", &archive.TarOptions{})
96+ if err != nil {
97+ panic(err)
98+ }
99+ defer buildCtx.Close()
100+
101+ fmt.Println("Building image...")
102+ imageBuildResponse, err := cli.ImageBuild(ctx, buildCtx, types.ImageBuildOptions{
103+ Tags: []string{"gordon-echo:latest"},
104+ })
105+ if err != nil {
106+ panic(err)
107+ }
108+ defer imageBuildResponse.Body.Close()
109+
110+ fmt.Println("Saving image to file...")
111+
112+ imageTar, err := cli.ImageSave(ctx, []string{"gordon-echo:latest"})
113+ if err != nil {
114+ panic(err)
115+ }
116+
117+ outputFile, err := os.Create("tmp/docker-test/gordon-echo.tar")
118+ if err != nil {
119+ panic(err)
120+ }
121+ defer outputFile.Close()
122+
123+ _, err = io.Copy(outputFile, imageTar)
124+ if err != nil {
125+ panic(err)
25 }126 }
26 }127 }
M pkg/utils/parser.go +21 -0
@@ -3,7 +3,9 @@ package utils
33 import (
44 "fmt"
55 "io"
6+ "os"
67
8+ "github.com/tidwall/gjson"
79 "gogs.bnema.dev/gordon-echo/internal/ui"
810 "gopkg.in/yaml.v3"
911 )
@@ -59,3 +61,22 @@ func PopulateDataFromYAML(currentLang string) (YamlData, error) {
5961 }
6062
6163 // Json Parser
64+
65+// ReadDataFromJSONFile loads the data from the given JSON file
66+func ReadDataFromJSONFile(filePath string) (string, error) {
67+ bytes, err := os.ReadFile(filePath)
68+ if err != nil {
69+ return "", err
70+ }
71+ return string(bytes), nil
72+}
73+
74+// QueryJSON queries the provided JSON content based on the given gjson query and returns the results as a slice of strings
75+func QueryJSON(jsonContent, query string) []string {
76+ results := gjson.GetMany(jsonContent, query)
77+ var values []string
78+ for _, result := range results {
79+ values = append(values, result.String())
80+ }
81+ return values
82+}
@@ -3,7 +3,9 @@ package utils
3 import (3 import (
4 "fmt"4 "fmt"
5 "io"5 "io"
6+ "os"
6 7
8+ "github.com/tidwall/gjson"
7 "gogs.bnema.dev/gordon-echo/internal/ui"9 "gogs.bnema.dev/gordon-echo/internal/ui"
8 "gopkg.in/yaml.v3"10 "gopkg.in/yaml.v3"
9 )11 )
@@ -59,3 +61,22 @@ func PopulateDataFromYAML(currentLang string) (YamlData, error) {
59 }61 }
60 62
61 // Json Parser63 // Json Parser
64+
65+// ReadDataFromJSONFile loads the data from the given JSON file
66+func ReadDataFromJSONFile(filePath string) (string, error) {
67+ bytes, err := os.ReadFile(filePath)
68+ if err != nil {
69+ return "", err
70+ }
71+ return string(bytes), nil
72+}
73+
74+// QueryJSON queries the provided JSON content based on the given gjson query and returns the results as a slice of strings
75+func QueryJSON(jsonContent, query string) []string {
76+ results := gjson.GetMany(jsonContent, query)
77+ var values []string
78+ for _, result := range results {
79+ values = append(values, result.String())
80+ }
81+ return values
82+}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close