From the uDemy course on LLM engineering.
https://www.udemy.com/course/llm-engineering-master-ai-and-large-language-models
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
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"] |