You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

287 lines
10 KiB

# Stage 1: Base development image
FROM ubuntu:22.04 AS builder
# Add metadata about build environment
LABEL org.opencontainers.image.title="CodeXchange AI Builder"
LABEL org.opencontainers.image.description="Multi-platform build environment for CodeXchange AI"
# Prevent interactive prompts during package installation
ENV DEBIAN_FRONTEND=noninteractive
# Install essential build tools and compilers
RUN apt-get update && apt-get install -y --no-install-recommends \
python3.10 \
python3-pip \
python3.10-venv \
build-essential \
gcc \
g++ \
openjdk-17-jdk \
curl \
ca-certificates \
git \
nodejs \
npm \
perl \
lua5.3 \
php \
r-base \
ruby \
rustc \
cargo \
mono-complete \
mono-devel \
mono-mcs \
sqlite3 \
unzip \
&& rm -rf /var/lib/apt/lists/*
# Install TypeScript
RUN npm install -g typescript
# Install Swift
RUN apt-get update && apt-get install -y --no-install-recommends \
binutils \
libc6-dev \
libcurl4 \
libedit2 \
libgcc-9-dev \
libpython3.10 \
libsqlite3-0 \
libstdc++-9-dev \
libxml2 \
libz3-dev \
pkg-config \
tzdata \
zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*
RUN arch=$(uname -m) && \
if [ "$arch" = "x86_64" ]; then \
SWIFT_URL="https://download.swift.org/swift-5.9.2-release/ubuntu2204/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-ubuntu22.04.tar.gz"; \
elif [ "$arch" = "aarch64" ] || [ "$arch" = "arm64" ]; then \
SWIFT_URL="https://download.swift.org/swift-5.9.2-release/ubuntu2204-aarch64/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-ubuntu22.04-aarch64.tar.gz"; \
else \
echo "Unsupported architecture for Swift: $arch"; \
exit 1; \
fi && \
curl -fL $SWIFT_URL | tar xz -C /opt && \
ln -s /opt/swift-5.9.2-RELEASE-ubuntu22.04*/usr/bin/swift /usr/local/bin/swift
# Install Kotlin
RUN KOTLIN_VERSION=1.9.22 && \
cd /tmp && \
curl -LO "https://github.com/JetBrains/kotlin/releases/download/v${KOTLIN_VERSION}/kotlin-compiler-${KOTLIN_VERSION}.zip" && \
unzip "kotlin-compiler-${KOTLIN_VERSION}.zip" -d /opt && \
rm "kotlin-compiler-${KOTLIN_VERSION}.zip" && \
ln -s "/opt/kotlinc/bin/kotlin" /usr/local/bin/kotlin && \
ln -s "/opt/kotlinc/bin/kotlinc" /usr/local/bin/kotlinc
# Install Julia based on architecture (with Windows WSL2 compatibility)
RUN arch=$(uname -m) && \
echo "Detected architecture: $arch" && \
if [ "$arch" = "aarch64" ] || [ "$arch" = "arm64" ]; then \
echo "Installing ARM64 version of Julia" && \
curl -fL https://julialang-s3.julialang.org/bin/linux/aarch64/1.9/julia-1.9.3-linux-aarch64.tar.gz | tar xz -C /opt && \
ln -s /opt/julia-1.9.3/bin/julia /usr/local/bin/julia; \
elif [ "$arch" = "x86_64" ] || [ "$arch" = "amd64" ]; then \
echo "Installing x86_64 version of Julia" && \
curl -fL https://julialang-s3.julialang.org/bin/linux/x64/1.9/julia-1.9.3-linux-x86_64.tar.gz | tar xz -C /opt && \
ln -s /opt/julia-1.9.3/bin/julia /usr/local/bin/julia; \
else \
echo "WARNING: Unknown architecture $arch, defaulting to x86_64" && \
curl -fL https://julialang-s3.julialang.org/bin/linux/x64/1.9/julia-1.9.3-linux-x86_64.tar.gz | tar xz -C /opt && \
ln -s /opt/julia-1.9.3/bin/julia /usr/local/bin/julia; \
fi
# Install Go based on architecture (with Windows WSL2 compatibility)
RUN arch=$(uname -m) && \
echo "Detected architecture for Go: $arch" && \
if [ "$arch" = "aarch64" ] || [ "$arch" = "arm64" ]; then \
echo "Installing ARM64 version of Go" && \
curl -L https://go.dev/dl/go1.21.6.linux-arm64.tar.gz | tar -C /usr/local -xzf -; \
elif [ "$arch" = "x86_64" ] || [ "$arch" = "amd64" ]; then \
echo "Installing x86_64 version of Go" && \
curl -L https://go.dev/dl/go1.21.6.linux-amd64.tar.gz | tar -C /usr/local -xzf -; \
else \
echo "WARNING: Unknown architecture $arch for Go, defaulting to x86_64" && \
curl -L https://go.dev/dl/go1.21.6.linux-amd64.tar.gz | tar -C /usr/local -xzf -; \
fi
ENV PATH="/usr/local/go/bin:${PATH}"
ENV GOPATH="/go"
ENV PATH="${GOPATH}/bin:${PATH}"
# Create app user
RUN useradd -m -s /bin/bash app
WORKDIR /app
# Copy project files
COPY --chown=app:app . .
# Create and activate virtual environment
RUN python3 -m venv /app/.venv
ENV PATH="/app/.venv/bin:$PATH"
# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Stage 2: Runtime image
FROM ubuntu:22.04
# Add metadata about runtime environment
LABEL org.opencontainers.image.title="AI CodeXchange"
LABEL org.opencontainers.image.description="Multi-platform AI CodeXchange application"
LABEL org.opencontainers.image.version="1.0"
# Create platform-specific label at build time
RUN echo "Building on $(uname -s) $(uname -m) architecture" > /platform-info.txt
LABEL org.opencontainers.image.platform="$(cat /platform-info.txt)"
# Install runtime dependencies
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
python3.10 \
python3-pip \
gcc \
g++ \
openjdk-17-jdk \
curl \
nodejs \
npm \
perl \
lua5.3 \
php \
r-base \
ruby \
rustc \
cargo \
mono-complete \
mono-devel \
mono-mcs \
sqlite3 \
unzip \
&& rm -rf /var/lib/apt/lists/*
# Install TypeScript
RUN npm install -g typescript
# Install Swift
RUN apt-get update && apt-get install -y --no-install-recommends \
binutils \
libc6-dev \
libcurl4 \
libedit2 \
libgcc-9-dev \
libpython3.10 \
libsqlite3-0 \
libstdc++-9-dev \
libxml2 \
libz3-dev \
pkg-config \
tzdata \
zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*
RUN arch=$(uname -m) && \
if [ "$arch" = "x86_64" ]; then \
SWIFT_URL="https://download.swift.org/swift-5.9.2-release/ubuntu2204/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-ubuntu22.04.tar.gz"; \
elif [ "$arch" = "aarch64" ] || [ "$arch" = "arm64" ]; then \
SWIFT_URL="https://download.swift.org/swift-5.9.2-release/ubuntu2204-aarch64/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-ubuntu22.04-aarch64.tar.gz"; \
else \
echo "Unsupported architecture for Swift: $arch"; \
exit 1; \
fi && \
curl -fL $SWIFT_URL | tar xz -C /opt && \
ln -s /opt/swift-5.9.2-RELEASE-ubuntu22.04*/usr/bin/swift /usr/local/bin/swift
# Install Kotlin
RUN KOTLIN_VERSION=1.9.22 && \
cd /tmp && \
curl -LO "https://github.com/JetBrains/kotlin/releases/download/v${KOTLIN_VERSION}/kotlin-compiler-${KOTLIN_VERSION}.zip" && \
unzip "kotlin-compiler-${KOTLIN_VERSION}.zip" -d /opt && \
rm "kotlin-compiler-${KOTLIN_VERSION}.zip" && \
ln -s "/opt/kotlinc/bin/kotlin" /usr/local/bin/kotlin && \
ln -s "/opt/kotlinc/bin/kotlinc" /usr/local/bin/kotlinc
# Install Julia based on architecture (with Windows WSL2 compatibility)
RUN arch=$(uname -m) && \
echo "Detected architecture: $arch" && \
if [ "$arch" = "aarch64" ] || [ "$arch" = "arm64" ]; then \
echo "Installing ARM64 version of Julia" && \
curl -fL https://julialang-s3.julialang.org/bin/linux/aarch64/1.9/julia-1.9.3-linux-aarch64.tar.gz | tar xz -C /opt && \
ln -s /opt/julia-1.9.3/bin/julia /usr/local/bin/julia; \
elif [ "$arch" = "x86_64" ] || [ "$arch" = "amd64" ]; then \
echo "Installing x86_64 version of Julia" && \
curl -fL https://julialang-s3.julialang.org/bin/linux/x64/1.9/julia-1.9.3-linux-x86_64.tar.gz | tar xz -C /opt && \
ln -s /opt/julia-1.9.3/bin/julia /usr/local/bin/julia; \
else \
echo "WARNING: Unknown architecture $arch, defaulting to x86_64" && \
curl -fL https://julialang-s3.julialang.org/bin/linux/x64/1.9/julia-1.9.3-linux-x86_64.tar.gz | tar xz -C /opt && \
ln -s /opt/julia-1.9.3/bin/julia /usr/local/bin/julia; \
fi
# Install Go runtime
COPY --from=builder /usr/local/go /usr/local/go
ENV PATH="/usr/local/go/bin:${PATH}"
ENV GOPATH="/go"
ENV PATH="${GOPATH}/bin:${PATH}"
# Create app user
RUN useradd -m -s /bin/bash app
WORKDIR /app
# Copy virtual environment and application files from builder
COPY --from=builder --chown=app:app /app/.venv /app/.venv
COPY --from=builder --chown=app:app /app /app
# Set environment variables
ENV PATH="/app/.venv/bin:$PATH" \
PYTHONPATH="/app/src" \
PYTHONUNBUFFERED=1 \
GRADIO_SERVER_NAME=0.0.0.0 \
GRADIO_SERVER_PORT=7860
# Create necessary directories with correct permissions
RUN mkdir -p /app/logs /app/downloads \
&& chown -R app:app /app/logs /app/downloads
# Verify installations with comprehensive platform information
RUN echo "======= PLATFORM & LANGUAGE VERIFICATION =======" && \
echo "OS: $(uname -s)" && \
echo "Architecture: $(uname -m)" && \
echo "Kernel: $(uname -r)" && \
echo "Host: $(uname -n)" && \
echo "\n=== Language Installations ===" && \
echo "Node.js: $(node --version 2>/dev/null || echo 'NOT VERIFIED')" && \
echo "TypeScript: $(tsc --version 2>/dev/null || echo 'NOT VERIFIED')" && \
echo "Java: $(java -version 2>&1 | head -n 1 || echo 'NOT VERIFIED')" && \
echo "Julia: $(julia --version 2>/dev/null || echo 'NOT VERIFIED')" && \
echo "Go: $(go version 2>/dev/null || echo 'NOT VERIFIED')" && \
echo "Python: $(python3 --version 2>/dev/null || echo 'NOT VERIFIED')" && \
echo "Perl: $(perl -v 2>/dev/null | head -n 2 || echo 'NOT VERIFIED')" && \
echo "Lua: $(lua5.3 -v 2>/dev/null || echo 'NOT VERIFIED')" && \
echo "PHP: $(php --version 2>/dev/null | head -n 1 || echo 'NOT VERIFIED')" && \
echo "R: $(R --version 2>/dev/null | head -n 1 || echo 'NOT VERIFIED')" && \
echo "Ruby: $(ruby --version 2>/dev/null || echo 'NOT VERIFIED')" && \
echo "Rust: $(rustc --version 2>/dev/null || echo 'NOT VERIFIED')" && \
echo "C#/Mono: $(mono-csc --version 2>/dev/null || echo 'NOT VERIFIED')" && \
echo "SQLite: $(sqlite3 --version 2>/dev/null || echo 'NOT VERIFIED')" && \
echo "Kotlin: $(kotlinc -version 2>&1 || echo 'NOT VERIFIED')" && \
echo "C++: $(g++ --version 2>/dev/null | head -n 1 || echo 'NOT VERIFIED')" && \
echo "\n=== Environment Variables ===" && \
echo "PATH: $PATH" && \
echo "======= VERIFICATION COMPLETE ======="
# Switch to non-root user
USER app
# Expose port
EXPOSE 7860
# Health check
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD curl -f http://localhost:7860/healthz || exit 1
# Set entrypoint and default command
ENTRYPOINT ["python3"]
CMD ["run.py"]