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.