From b89a9e87c8bb51dee225410023dbee24e287f1f7 Mon Sep 17 00:00:00 2001 From: mariobassem Date: Tue, 4 Feb 2025 18:44:02 +0200 Subject: [PATCH] feat: Add open-webui example using Docker - Created an example to create a docker image for open-webui - The `docker_recipe_env.v` file is updated to correctly handle quoting in environment variables. Co-authored-by: mahmmoud.hassanein --- examples/virt/docker/ai_web_ui/ai_web_ui.vsh | 30 ++++++++++++++++++++ lib/virt/docker/docker_recipe_env.v | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 examples/virt/docker/ai_web_ui/ai_web_ui.vsh diff --git a/examples/virt/docker/ai_web_ui/ai_web_ui.vsh b/examples/virt/docker/ai_web_ui/ai_web_ui.vsh new file mode 100644 index 00000000..ffe84d2f --- /dev/null +++ b/examples/virt/docker/ai_web_ui/ai_web_ui.vsh @@ -0,0 +1,30 @@ +#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run + +import freeflowuniverse.herolib.virt.docker + +mut engine := docker.new(prefix: '', localonly: true)! + +mut r := engine.recipe_new(name: 'dev_ubuntu', platform: .ubuntu) + +r.add_from(image: 'ubuntu', tag: 'latest')! +r.add_package(name: 'git,curl')! + +r.add_zinit()! +r.add_sshserver()! + +r.add_run(cmd: 'curl -LsSf https://astral.sh/uv/install.sh | sh')! +r.add_env('PATH', '/root/.local/bin:\$PATH')! +r.add_run(cmd: 'uv python install 3.12')! +r.add_run(cmd: 'uv venv /opt/venv')! +r.add_env('VIRTUAL_ENV', '/opt/venv')! +r.add_env('PATH', '/opt/venv/bin:\$PATH')! +r.add_run(cmd: 'uv pip install open-webui')! +r.add_zinit_cmd( + exec: "bash -c 'VIRTUAL_ENV=/opt/venv DATA_DIR=~/.open-webui /root/.local/bin/uvx --python 3.12 open-webui serve'" + name: 'open-webui' +)! + +r.add_run(cmd: 'apt-get clean')! +r.add_run(cmd: 'rm -rf /var/lib/apt/lists/*')! + +r.build(true)! diff --git a/lib/virt/docker/docker_recipe_env.v b/lib/virt/docker/docker_recipe_env.v index d8cccc7b..3804864b 100644 --- a/lib/virt/docker/docker_recipe_env.v +++ b/lib/virt/docker/docker_recipe_env.v @@ -25,5 +25,5 @@ pub fn (mut i EnvItem) check() ! { } pub fn (mut i EnvItem) render() !string { - return "ENV ${i.name}='${i.value}'" + return 'ENV ${i.name}="${i.value}"' }