File size: 6,647 Bytes
2946197
15aa55d
 
efd2c82
15aa55d
efd2c82
15aa55d
 
efd2c82
 
15aa55d
efd2c82
 
15aa55d
efd2c82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15aa55d
efd2c82
 
 
 
 
 
 
 
15aa55d
efd2c82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import gradio as gr
import docker
import os
from docker.errors import DockerException, BuildError, APIError

# Docker client setup
client = docker.from_env()

# Function to build Docker image with status update and error handling
def build_docker_image(dockerfile, context_directory, api_key, status_callback):
    try:
        if api_key != os.getenv("DOCKER_API_KEY"):
            return "Invalid API Key"
        
        status_callback("Building image...")
        image, logs = client.images.build(path=context_directory, dockerfile=dockerfile, rm=True)
        status_callback(f"Image built successfully: {image.tags[0]}")
        return f"Image built successfully: {image.tags[0]}"
    
    except BuildError as e:
        status_callback(f"Build error: {e}")
        return f"Build error: {e}"
    except APIError as e:
        status_callback(f"Docker API error: {e}")
        return f"Docker API error: {e}"
    except Exception as e:
        status_callback(f"Unexpected error: {e}")
        return f"Unexpected error: {e}"

# Function to pull an image from Docker Hub with error handling
def pull_image_from_dockerhub(image_name, api_key, status_callback):
    try:
        if api_key != os.getenv("DOCKER_API_KEY"):
            return "Invalid API Key"
        
        status_callback(f"Pulling image: {image_name}...")
        image = client.images.pull(image_name)
        status_callback(f"Image {image_name} pulled successfully: {image.id}")
        return f"Image {image_name} pulled successfully: {image.id}"
    
    except APIError as e:
        status_callback(f"Docker API error: {e}")
        return f"Docker API error: {e}"
    except Exception as e:
        status_callback(f"Unexpected error: {e}")
        return f"Unexpected error: {e}"

# Function to start a container with error handling
def start_container(image_name, status_callback):
    try:
        status_callback(f"Starting container with image: {image_name}...")
        container = client.containers.run(image_name, detach=True)
        status_callback(f"Container {container.id} started successfully")
        return f"Container {container.id} started successfully"
    except DockerException as e:
        status_callback(f"Docker error: {e}")
        return f"Docker error: {e}"
    except Exception as e:
        status_callback(f"Unexpected error: {e}")
        return f"Unexpected error: {e}"

# Function to stop a container with error handling
def stop_container(container_id, status_callback):
    try:
        status_callback(f"Stopping container {container_id}...")
        container = client.containers.get(container_id)
        container.stop()
        status_callback(f"Container {container.id} stopped successfully")
        return f"Container {container.id} stopped successfully"
    except docker.errors.NotFound as e:
        status_callback(f"Error: Container {container_id} not found")
        return f"Error: Container {container_id} not found"
    except DockerException as e:
        status_callback(f"Docker error: {e}")
        return f"Docker error: {e}"
    except Exception as e:
        status_callback(f"Unexpected error: {e}")
        return f"Unexpected error: {e}"

# Tab 1 - Build Docker Image with Status Visualization
def docker_build_tab():
    with gr.Column():
        dockerfile_input = gr.Textbox(label="Dockerfile Content", lines=10)
        context_directory_input = gr.Textbox(label="Context Directory", placeholder="Enter directory path", lines=1)
        api_key_input = gr.Textbox(label="Docker API Key", type="password")
        build_button = gr.Button("Build Image")
        build_output = gr.Textbox(label="Build Output", interactive=False)
        status_output = gr.Textbox(label="Status", interactive=False)

        build_button.click(build_docker_image, inputs=[dockerfile_input, context_directory_input, api_key_input, status_output], outputs=build_output)

    return dockerfile_input, context_directory_input, api_key_input, build_button, build_output, status_output

# Tab 2 - Pull Docker Image from Docker Hub with Status Visualization
def docker_pull_tab():
    with gr.Column():
        image_name_input = gr.Textbox(label="Docker Image (e.g., python:3.8)", lines=1)
        api_key_input = gr.Textbox(label="Docker API Key", type="password")
        pull_button = gr.Button("Pull Image")
        pull_output = gr.Textbox(label="Pull Output", interactive=False)
        status_output = gr.Textbox(label="Status", interactive=False)

        pull_button.click(pull_image_from_dockerhub, inputs=[image_name_input, api_key_input, status_output], outputs=pull_output)

    return image_name_input, api_key_input, pull_button, pull_output, status_output

# Tab 3 - Container Management with Status Visualization
def container_management_tab():
    with gr.Column():
        start_image_input = gr.Textbox(label="Image Name", lines=1)
        start_button = gr.Button("Start Container")
        start_output = gr.Textbox(label="Start Output", interactive=False)
        status_output = gr.Textbox(label="Status", interactive=False)

        stop_container_input = gr.Textbox(label="Container ID to Stop", lines=1)
        stop_button = gr.Button("Stop Container")
        stop_output = gr.Textbox(label="Stop Output", interactive=False)

        start_button.click(start_container, inputs=[start_image_input, status_output], outputs=start_output)
        stop_button.click(stop_container, inputs=[stop_container_input, status_output], outputs=stop_output)

    return start_image_input, start_button, start_output, stop_container_input, stop_button, stop_output, status_output

# Tab 4 - Code Editor
def code_editor_tab():
    with gr.Column():
        code_input = gr.Textbox(label="Code Editor", lines=15, interactive=True)
        save_button = gr.Button("Save Code")
        save_output = gr.Textbox(label="Save Output", interactive=False)

        save_button.click(lambda code: "Code saved successfully" if code else "No code to save", inputs=code_input, outputs=save_output)

    return code_input, save_button, save_output

# Gradio Interface Setup
def main():
    with gr.Blocks() as demo:
        gr.Markdown("### Docker Management Gradio App")

        with gr.Tabs():
            with gr.TabItem("Build Docker Image"):
                docker_build_tab()
            with gr.TabItem("Pull Docker Image from Docker Hub"):
                docker_pull_tab()
            with gr.TabItem("Container Management"):
                container_management_tab()
            with gr.TabItem("Code Editor"):
                code_editor_tab()

    demo.launch()

if __name__ == "__main__":
    main()