vs2 / Dockerfile
OnBhar's picture
Create Dockerfile
d8148a1 verified
# ===============================
# Base: Ubuntu + code-server + Flutter + Android SDK + Chrome + Kotlin + Gradle
# ===============================
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
ENV ANDROID_SDK_ROOT=/home/coder/android-sdk
ENV FLUTTER_HOME=/home/coder/flutter
ENV NVM_DIR=/usr/local/nvm
ENV NODE_VERSION=22
ENV GRADLE_HOME=/opt/gradle
ENV KOTLIN_HOME=/opt/kotlin
ENV PATH=$FLUTTER_HOME/bin:$FLUTTER_HOME/bin/cache/dart-sdk/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$ANDROID_SDK_ROOT/emulator:$GRADLE_HOME/bin:$KOTLIN_HOME/bin:$NVM_DIR/versions/node/v$NODE_VERSION/bin:/usr/local/go/bin:$PATH
# -------------------------------
# Create coder user (passwordless sudo)
# -------------------------------
RUN apt-get update && apt-get install -y sudo \
&& useradd -m -s /bin/bash coder \
&& echo "coder ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER root
WORKDIR /home/coder
# -------------------------------
# System Dependencies
# -------------------------------
RUN apt-get update && apt-get install -y \
curl wget git unzip zip gnupg ca-certificates software-properties-common build-essential \
python3 python3-pip python3-venv \
php php-cli php-mbstring php-xml php-curl php-zip php-gd php-bcmath php-intl php-json \
redis-tools openjdk-17-jdk \
libglu1-mesa libpulse0 libxi6 libxrender1 libxrandr2 libxcomposite1 libxcursor1 libxdamage1 \
clang cmake ninja-build pkg-config \
&& rm -rf /var/lib/apt/lists/*
# -------------------------------
# Install Google Chrome
# -------------------------------
RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list' \
&& apt-get update && apt-get install -y google-chrome-stable \
&& rm -rf /var/lib/apt/lists/*
# -------------------------------
# Install Composer
# -------------------------------
RUN curl -sS https://getcomposer.org/installer -o composer-setup.php \
&& php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
&& rm composer-setup.php
# -------------------------------
# Install Go
# -------------------------------
ENV GO_VERSION=1.23.2
RUN curl -LO https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz \
&& tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz \
&& rm go${GO_VERSION}.linux-amd64.tar.gz
# -------------------------------
# Install NVM + Node + Yarn + pnpm
# -------------------------------
RUN mkdir -p $NVM_DIR \
&& curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash \
&& . $NVM_DIR/nvm.sh \
&& nvm install $NODE_VERSION \
&& nvm use $NODE_VERSION \
&& npm install -g yarn pnpm \
&& ln -s $NVM_DIR/versions/node/v$NODE_VERSION/bin/node /usr/local/bin/node \
&& ln -s $NVM_DIR/versions/node/v$NODE_VERSION/bin/npm /usr/local/bin/npm \
&& ln -s $NVM_DIR/versions/node/v$NODE_VERSION/bin/yarn /usr/local/bin/yarn \
&& ln -s $NVM_DIR/versions/node/v$NODE_VERSION/bin/pnpm /usr/local/bin/pnpm
# -------------------------------
# Install ngrok
# -------------------------------
RUN curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
&& echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | tee /etc/apt/sources.list.d/ngrok.list \
&& apt-get update && apt-get install -y ngrok \
&& rm -rf /var/lib/apt/lists/*
# -------------------------------
# Install code-server
# -------------------------------
RUN curl -fsSL https://code-server.dev/install.sh | sh
# -------------------------------
# Install Android SDK Command-line Tools
# -------------------------------
RUN mkdir -p $ANDROID_SDK_ROOT/cmdline-tools \
&& curl -o sdk-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip \
&& unzip sdk-tools.zip -d $ANDROID_SDK_ROOT/cmdline-tools \
&& rm sdk-tools.zip \
&& mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/latest
# -------------------------------
# Install Android SDK Packages
# -------------------------------
RUN yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses \
&& $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" "emulator" \
&& $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --update
# -------------------------------
# Install Gradle
# -------------------------------
RUN wget https://services.gradle.org/distributions/gradle-8.13-bin.zip -O /tmp/gradle.zip \
&& unzip /tmp/gradle.zip -d /opt \
&& mv /opt/gradle-8.13 /opt/gradle \
&& rm /tmp/gradle.zip
# -------------------------------
# Install Kotlin
# -------------------------------
RUN wget https://github.com/JetBrains/kotlin/releases/download/v2.0.21/kotlin-compiler-2.0.21.zip -O /tmp/kotlin.zip \
&& unzip /tmp/kotlin.zip -d /opt \
&& mv /opt/kotlinc /opt/kotlin \
&& rm /tmp/kotlin.zip
# -------------------------------
# Install Flutter
# -------------------------------
USER coder
RUN git clone https://github.com/flutter/flutter.git -b stable $FLUTTER_HOME \
&& $FLUTTER_HOME/bin/flutter config --android-sdk $ANDROID_SDK_ROOT \
&& $FLUTTER_HOME/bin/flutter precache \
&& $FLUTTER_HOME/bin/flutter doctor -v
# -------------------------------
# Setup workspace
# -------------------------------
USER root
RUN mkdir -p /home/coder/workspace /home/coder/.config /home/coder/.local/share/code-server \
&& chown -R coder:coder /home/coder \
&& chmod -R 755 /home/coder
USER coder
WORKDIR /home/coder/workspace
EXPOSE 7860
# -------------------------------
# Start code-server
# -------------------------------
CMD ["bash", "-c", "code-server --bind-addr 0.0.0.0:7860 --auth password --user-data-dir /home/coder/.local/share/code-server"]