From c5df0a024015ba69dfd219b6a82edfe1060b0812 Mon Sep 17 00:00:00 2001 From: f-trycua Date: Wed, 7 May 2025 16:36:22 -0700 Subject: [PATCH] Simplify Lumier README --- libs/lumier/.dockerignore | 1 + libs/lumier/Dockerfile | 6 +- libs/lumier/README.md | 96 +++++++++++++++++++++++-- libs/lumier/examples/Custom.Dockerfile | 31 -------- libs/lumier/examples/docker-compose.yml | 44 ------------ libs/lumier/src/bin/entry.sh | 44 ++++-------- 6 files changed, 106 insertions(+), 116 deletions(-) delete mode 100644 libs/lumier/examples/Custom.Dockerfile delete mode 100644 libs/lumier/examples/docker-compose.yml diff --git a/libs/lumier/.dockerignore b/libs/lumier/.dockerignore index 3e0f9c98..4a4b321a 100644 --- a/libs/lumier/.dockerignore +++ b/libs/lumier/.dockerignore @@ -22,3 +22,4 @@ venv/ test-results/ # Ignore anything else you don't want in the Docker build context +./examples \ No newline at end of file diff --git a/libs/lumier/Dockerfile b/libs/lumier/Dockerfile index 06829adf..c66bb9f7 100644 --- a/libs/lumier/Dockerfile +++ b/libs/lumier/Dockerfile @@ -30,10 +30,10 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* # Download and install noVNC without caching -RUN wget https://github.com/trycua/noVNC/archive/refs/heads/master.zip -O master.zip && \ - unzip master.zip && \ +RUN wget https://github.com/trycua/noVNC/archive/refs/heads/master.zip -O master1.zip && \ + unzip master1.zip && \ mv noVNC-master /opt/noVNC && \ - rm master.zip + rm master1.zip # Set environment variables for noVNC ENV NOVNC_PATH="/opt/noVNC" diff --git a/libs/lumier/README.md b/libs/lumier/README.md index ffdb4c5f..544e27bf 100644 --- a/libs/lumier/README.md +++ b/libs/lumier/README.md @@ -55,10 +55,7 @@ Here's what's happening behind the scenes: # 1. Navigate to the Lumier directory cd libs/lumier -# 2. Build the Docker image (first-time setup) -docker build -t lumier:latest . - -# 3. Run the container with temporary storage +# 2. Run the container with temporary storage (using pre-built image from Docker Hub) docker run -it --rm \ --name lumier-vm \ -p 8006:8006 \ @@ -66,7 +63,7 @@ docker run -it --rm \ -e VERSION=ghcr.io/trycua/macos-sequoia-cua:latest \ -e CPU_CORES=4 \ -e RAM_SIZE=8192 \ - lumier:latest + trycua/lumier:latest ``` After running the command above, you can access your macOS VM through a web browser (e.g., http://localhost:8006). @@ -91,7 +88,7 @@ docker run -it --rm \ -e CPU_CORES=4 \ -e RAM_SIZE=8192 \ -e HOST_STORAGE_PATH=$(pwd)/storage \ - lumier:latest + trycua/lumier:latest ``` This command creates a connection between a folder on your Mac (`$(pwd)/storage`) and a folder inside the Docker container (`/storage`). The `-v` flag (volume mount) and the `HOST_STORAGE_PATH` variable work together to ensure your VM data is saved on your host Mac. @@ -116,11 +113,96 @@ docker run -it --rm \ -e RAM_SIZE=8192 \ -e HOST_STORAGE_PATH=$(pwd)/storage \ -e HOST_SHARED_PATH=$(pwd)/shared \ - lumier:latest + trycua/lumier:latest ``` With this setup, any files you place in the `shared` folder on your Mac will be accessible from within the macOS VM, and vice versa. +## Using Docker Compose + +You can also use Docker Compose to run Lumier with a simple configuration file. Create a `docker-compose.yml` file with the following content: + +```yaml +version: '3' + +services: + lumier: + image: trycua/lumier:latest + container_name: lumier-vm + restart: unless-stopped + ports: + - "8006:8006" # Port for VNC access + volumes: + - ./storage:/storage # VM persistent storage + - ./shared:/shared # Shared folder accessible in the VM + environment: + - VM_NAME=lumier-vm + - VERSION=ghcr.io/trycua/macos-sequoia-cua:latest + - CPU_CORES=4 + - RAM_SIZE=8192 + - HOST_STORAGE_PATH=${PWD}/storage + - HOST_SHARED_PATH=${PWD}/shared + stop_signal: SIGINT + stop_grace_period: 2m +``` + +Then run Lumier using: + +```bash +# First create the required directories +mkdir -p storage shared + +# Start the container +docker-compose up -d + +# View the logs +docker-compose logs -f + +# Stop the container when done +docker-compose down +``` + +## Building and Customizing Lumier + +If you want to customize the Lumier container or build it from source, you can follow these steps: + +```bash +# 1. Navigate to the Lumier directory +cd libs/lumier + +# 2. Build the Docker image locally +docker build -t lumier-custom:latest . + +# 3. Run your custom build +docker run -it --rm \ + --name lumier-vm \ + -p 8006:8006 \ + -e VM_NAME=lumier-vm \ + -e VERSION=ghcr.io/trycua/macos-sequoia-cua:latest \ + -e CPU_CORES=4 \ + -e RAM_SIZE=8192 \ + lumier-custom:latest +``` + +### Customization Options + +The Dockerfile provides several customization points: + +1. **Base image**: The container uses Debian Bullseye Slim as the base. You can modify this if needed. +2. **Installed packages**: You can add or remove packages in the apt-get install list. +3. **Hooks**: Check the `/run/hooks/` directory for scripts that run at specific points during VM lifecycle. +4. **Configuration**: Review `/run/config/constants.sh` for default settings. + +After making your modifications, you can build and push your custom image to your own Docker Hub repository: + +```bash +# Build with a custom tag +docker build -t yourusername/lumier:custom . + +# Push to Docker Hub (after docker login) +docker push yourusername/lumier:custom +``` + ## Configuration Options When running Lumier, you'll need to configure a few things: diff --git a/libs/lumier/examples/Custom.Dockerfile b/libs/lumier/examples/Custom.Dockerfile deleted file mode 100644 index 9938f656..00000000 --- a/libs/lumier/examples/Custom.Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -# Custom Lumier image that uses the base lumier:latest image -# and overrides environment variables as needed -FROM trycua/lumier:latest - -# Default environment variables that can be overridden at build time -# These values will override the defaults from the base image -ARG CUSTOM_VERSION="ghcr.io/trycua/macos-sequoia-vanilla:latest" -ARG CUSTOM_RAM_SIZE="16384" -ARG CUSTOM_CPU_CORES="8" -ARG CUSTOM_DISK_SIZE="100" -ARG CUSTOM_DISPLAY="1024x768" -ARG CUSTOM_VM_NAME="custom-vanilla-lumier" - -# Set environment variables based on build args -ENV VERSION=${CUSTOM_VERSION} -ENV RAM_SIZE=${CUSTOM_RAM_SIZE} -ENV CPU_CORES=${CUSTOM_CPU_CORES} -ENV DISK_SIZE=${CUSTOM_DISK_SIZE} -ENV DISPLAY=${CUSTOM_DISPLAY} -ENV VM_NAME=${CUSTOM_VM_NAME} - -# Create the necessary directory for lifecycle scripts -RUN mkdir -p /run/lifecycle - -# Copy custom on-logon script to be executed inside the VM after login -COPY src/lifecycle/on-logon.sh /run/lifecycle/on-logon.sh - -# Make sure the script is executable -RUN chmod +x /run/lifecycle/on-logon.sh - -# We're using the default entrypoint from the base image diff --git a/libs/lumier/examples/docker-compose.yml b/libs/lumier/examples/docker-compose.yml deleted file mode 100644 index 96afbd18..00000000 --- a/libs/lumier/examples/docker-compose.yml +++ /dev/null @@ -1,44 +0,0 @@ -version: '3' - -# IMPORTANT: Before using this docker-compose file, start the tunnel manually: -# socat TCP-LISTEN:8080,reuseaddr,fork EXEC:"$(pwd)/../src/bin/tunnel.sh" & - -services: - lumier: - image: lumier:latest # or trycua/lumier:latest if using the Docker Hub image - container_name: lumier-vm - restart: unless-stopped - ports: - - "8006:8006" # Port for VNC access - volumes: - - ../storage:/storage # VM persistent storage (relative path from docker-compose.yml) - - ../shared:/data # Shared folder accessible in the VM - environment: - - VM_NAME=lumier-vm - - VERSION=ghcr.io/trycua/macos-sequoia-vanilla:latest # Default MacOS image - - CPU_CORES=4 # Number of CPU cores - - RAM_SIZE=8192 # RAM in MB - - HOST_STORAGE_PATH=${PWD}/../storage # Required for Docker-only setup - - HOST_SHARED_PATH=${PWD}/../shared # Required for Docker-only setup - - LUMIER_DEBUG=0 # Set to 1 for debug mode - # Network mode host is optional but can improve performance - # network_mode: host - - # Uncomment the following lines if needed for KVM virtualization - # devices: - # - /dev/kvm - # - /dev/net/tun - stop_signal: SIGINT - stop_grace_period: 2m - -# Note: When using Docker Compose for Lumier, you're responsible for: -# - Starting and managing the tunnel (using socat as shown above) -# - Building the Docker image before first use (docker-compose build) -# - Providing the correct environment variables (HOST_STORAGE_PATH and HOST_SHARED_PATH) -# -# To stop the tunnel when done: -# 1. Find the process: lsof -i TCP:8080 -# 2. Kill it by PID: kill -# -# Access the VM via VNC at: http://localhost:8006/vnc.html -# The password will be displayed in the logs (docker-compose logs) diff --git a/libs/lumier/src/bin/entry.sh b/libs/lumier/src/bin/entry.sh index 44d37b9d..6081a17e 100755 --- a/libs/lumier/src/bin/entry.sh +++ b/libs/lumier/src/bin/entry.sh @@ -31,14 +31,12 @@ if [ -z "${VM_NAME:-}" ]; then export VM_NAME fi -# Set HOST_STORAGE_PATH to a macOS ephemeral path if not set +# Set HOST_STORAGE_PATH to a lume ephemeral storage if not set if [ -z "${HOST_STORAGE_PATH:-}" ]; then - # Use macOS /private/tmp directory which gets automatically cleaned - # This is the proper temporary directory on macOS that's regularly purged - HOST_STORAGE_PATH="/private/tmp/lumier_storage" + HOST_STORAGE_PATH="ephemeral" # Tell user that ephemeral storage is being used - echo "Using ephemeral storage at ${HOST_STORAGE_PATH}. VM state will be lost when macOS cleans up temporary files." + echo "Using ephemeral storage. VM state will be lost when macOS cleans up temporary files." export HOST_STORAGE_PATH fi @@ -56,6 +54,12 @@ if [ "${LUMIER_DEBUG:-0}" == "1" ]; then # fi fi +# Check if we're running as PID 1 (important for Docker signal handling) +if [ $$ -ne 1 ]; then + echo "Warning: This script is not running as PID 1 (current PID: $$)." + echo "Docker signal handling may not work properly when stopped from Docker Desktop." +fi + # Log startup info echo "Lumier VM is starting..." @@ -73,43 +77,21 @@ cleanup() { fi # Attempt to clean up ephemeral storage if it's in the /private/tmp directory - if [[ "$HOST_STORAGE_PATH" == "/private/tmp/lumier_"* ]]; then - echo "[cleanup] Checking if VM exists before cleanup..." - + if [[ "$HOST_STORAGE_PATH" == "ephemeral" ]]; then # First check if VM actually exists VM_INFO=$(lume_get "$VM_NAME" "$HOST_STORAGE_PATH" "json" "false") # Only try VM deletion if VM exists and not in the middle of a pull if [[ "$PULL_IN_PROGRESS" != "1" && $VM_INFO != *"Virtual machine not found"* ]]; then - echo "[cleanup] Removing VM and storage using API: $HOST_STORAGE_PATH" + echo "[cleanup] Cleaning up VM..." lume_delete "$VM_NAME" "$HOST_STORAGE_PATH" > /dev/null 2>&1 - else - echo "[cleanup] No VM found or pull was interrupted, skipping API deletion" fi fi - # Now gently stop noVNC proxy if running - # if [ -n "${NOVNC_PID:-}" ] && kill -0 "$NOVNC_PID" 2>/dev/null; then - # echo "[cleanup] Stopping noVNC proxy (PID $NOVNC_PID)..." - # kill -TERM "$NOVNC_PID" - # # Wait up to 5s for noVNC to exit - # for i in {1..5}; do - # if ! kill -0 "$NOVNC_PID" 2>/dev/null; then - # echo "[cleanup] noVNC proxy stopped." - # break - # fi - # sleep 1 - # done - # # Escalate if still running - # if kill -0 "$NOVNC_PID" 2>/dev/null; then - # echo "[cleanup] noVNC proxy did not exit, killing..." - # kill -KILL "$NOVNC_PID" 2>/dev/null - # fi - # fi - echo "[cleanup] Done. Exiting." exit 0 } -trap cleanup SIGTERM SIGINT +# Ensure we catch all typical container termination signals +trap cleanup SIGTERM SIGINT SIGHUP # Now enable strict error handling after initialization set -euo pipefail