diff --git a/backend/dockge-server.ts b/backend/dockge-server.ts
index 9d6fc43..ca081b5 100644
--- a/backend/dockge-server.ts
+++ b/backend/dockge-server.ts
@@ -29,6 +29,7 @@ import { Stack } from "./stack";
import { Cron } from "croner";
import gracefulShutdown from "http-graceful-shutdown";
import User from "./models/user";
+import childProcess from "child_process";
export class DockgeServer {
app : Express;
@@ -516,6 +517,20 @@ export class DockgeServer {
}
}
+ getDockerNetworkList() : string[] {
+ let res = childProcess.spawnSync("docker", [ "network", "ls", "--format", "{{.Name}}" ]);
+ let list = res.stdout.toString().split("\n");
+
+ // Remove empty string item
+ list = list.filter((item) => {
+ return item !== "";
+ }).sort((a, b) => {
+ return a.localeCompare(b);
+ });
+
+ return list;
+ }
+
get stackDirFullPath() {
return path.resolve(this.stacksDir);
}
diff --git a/backend/socket-handlers/docker-socket-handler.ts b/backend/socket-handlers/docker-socket-handler.ts
index 557f5f0..e1049e8 100644
--- a/backend/socket-handlers/docker-socket-handler.ts
+++ b/backend/socket-handlers/docker-socket-handler.ts
@@ -203,6 +203,20 @@ export class DockerSocketHandler extends SocketHandler {
callbackError(e, callback);
}
});
+
+ // getExternalNetworkList
+ socket.on("getDockerNetworkList", async (callback) => {
+ try {
+ checkLogin(socket);
+ const dockerNetworkList = server.getDockerNetworkList();
+ callback({
+ ok: true,
+ dockerNetworkList,
+ });
+ } catch (e) {
+ callbackError(e, callback);
+ }
+ });
}
saveStack(socket : DockgeSocket, server : DockgeServer, name : unknown, composeYAML : unknown, isAdd : unknown) : Stack {
diff --git a/frontend/components.d.ts b/frontend/components.d.ts
index f2e49e3..bafec4c 100644
--- a/frontend/components.d.ts
+++ b/frontend/components.d.ts
@@ -10,6 +10,7 @@ declare module 'vue' {
About: typeof import('./src/components/settings/About.vue')['default']
Appearance: typeof import('./src/components/settings/Appearance.vue')['default']
ArrayInput: typeof import('./src/components/ArrayInput.vue')['default']
+ ArraySelect: typeof import('./src/components/ArraySelect.vue')['default']
BModal: typeof import('bootstrap-vue-next')['BModal']
Confirm: typeof import('./src/components/Confirm.vue')['default']
Container: typeof import('./src/components/Container.vue')['default']
diff --git a/frontend/src/components/ArraySelect.vue b/frontend/src/components/ArraySelect.vue
new file mode 100644
index 0000000..563bcbd
--- /dev/null
+++ b/frontend/src/components/ArraySelect.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+