Crear un contenedor de Expo (EAS) con Docker para generar Build Android para React Native

Tiempo de lectura: 3 minutos

Hola, hoy vamos a ver cómo podemos crear un contenedor Docker que genera Builds Android (APKs) de forma local usando React Native.

Primero vamos a generar nuestro proyecto docker-compose.yml de la siguiente forma:

version: "3.1"
services:

  react_native_dev:
    build: 
      context: ./Dockerfile
      dockerfile: react_native
    restart: unless-stopped
    container_name: react_native_dev
    environment:
      EXPO_CLI_NO_PROMPT: 1
      EXPO_TOKEN: "token_expo"
    volumes:
      - ./app_react:/app
    ports:
      - "3000:3000"
    command: sh -c "npm install && expo start"
    networks:
      - docker-network

networks:
  docker-network:
    driver: bridge

Para generar la variable de entorno EXPO_TOKEN, debes hacer lo que indica Expo: https://docs.expo.dev/accounts/programmatic-access/

Web para generar tokens: https://expo.dev/accounts/[account]/settings/access-tokens

Para ello vamos a Expo.dev, iniciamos sesión con nuestra cuenta y generamos un Token de Acceso:

Elegimos tipo Personal Access Token:

Ahora copiamos el contenido del token y lo pegamos en la variable EXPO_TOKEN

Una vez generado, tenemos que crear la carpeta Dockerfile y el fichero react_native con este contenido:

# Usa una imagen de Node.js como base
FROM node:latest

# Instala Android SDK y herramientas
RUN apt-get update && apt-get install -y \
    wget \
    unzip \
    openjdk-11-jdk \
    curl \
    && rm -rf /var/lib/apt/lists/*

#Instala Android SDK:

# Variables de entorno
ENV ANDROID_HOME=/opt/android-sdk-linux
ENV ANDROID_SDK_ROOT=/opt/android-sdk-linux
ENV PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools
ENV ANDROID_VERSION=30
ENV ANDROID_BUILD_TOOLS_VERSION=30.0.3

RUN wget https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip
RUN mkdir -p ${ANDROID_HOME}/cmdline-tools
RUN unzip commandlinetools-linux-9477386_latest.zip -d ${ANDROID_HOME}/cmdline-tools
RUN rm commandlinetools-linux-9477386_latest.zip
RUN mv ${ANDROID_HOME}/cmdline-tools/cmdline-tools ${ANDROID_HOME}/cmdline-tools/latest
ENV PATH=${PATH}:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools
RUN yes | sdkmanager --licenses
RUN yes | sdkmanager --update
RUN yes | sdkmanager "platform-tools"
RUN yes | sdkmanager "platforms;android-${ANDROID_VERSION}"
RUN yes | sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}"
RUN yes | sdkmanager "extras;android;m2repository"
RUN yes | sdkmanager "extras;google;m2repository"
RUN yes | sdkmanager "extras;google;google_play_services"

# Crea un directorio de trabajo
WORKDIR /app

# Instalar JDK
#RUN apt-get update && apt-get install -y openjdk-11-jdk

# Configurar JAVA_HOME
ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
# Instala Expo CLI y EAS CLI globalmente
RUN npm install -g expo-cli && \
    npm install -g eas-cli

# Exponer el puerto 3000 para Expo
EXPOSE 3000

# Mantener el contenedor en ejecución a la espera de comandos
CMD ["/bin/bash"]

Y ahora solo tendremos que copiar nuestro proyecto en la carpeta ./app_react y ejecutar el docker compose utilizando este comando:

docker compose up -d

De esta forma dejaremos el contenedor en ejecución en segundo plano y podremos lanzar comandos cómo:

docker exec react_native_dev npx expo start --dev-client

Para generar el APK, primero tendremos que iniciar sesión con eas.
Para ello utilizamos este comando:

docker exec -it react_native_dev eas login

Ahora introducimos nuestro email y password usado en Expo, si no disponemos de cuenta, podemos crear una https://expo.dev/

Y para generar el APK, tendremos que ejecutar:

docker exec react_native_dev eas build --platform android --local --non-interactive

Una vez generado el APK, este se podrá acceder desde la ruta:

/app/id.apk

Deja un comentario