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


Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.