# =============================== # 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"]