5.4 KiB
Soporte multi-arquitectura (amd64 + arm64) para vscode-server
Contexto
La imagen vscode-server hoy solo se construye y publica para linux/amd64 (ver
.gitea/workflows/main-workflow.yml:85). El usuario quiere consumir esta imagen nativamente
desde una Mac con chip Apple Silicon (arm64), y seguir publicándola en el registry de Gitea
(gitea.p-lao.com/aleleba/vscode-server).
La imagen base gitea.p-lao.com/aleleba/vscode:latest (repo
aleleba/aleleba-vscode-dockerfile-configuration) ya se publica multi-arch (confirmado: su
workflow construye con platforms: linux/amd64,linux/arm64 y su Dockerfile usa
$(dpkg --print-architecture) para resolver rutas dependientes de arquitectura), así que es una
base válida para extender.
Al revisar Dockerfile completo se encontraron dos problemas que romperían o degradarían el
build en arm64, y ambos ya se resolvieron con el usuario:
JAVA_HOMEhardcodeado aamd64(Dockerfile:106, y de nuevo en el~/.bashrcenDockerfile:160) — en Debian/Ubuntu la ruta deopenjdk-17-jdkes/usr/lib/jvm/java-17-openjdk-<arch>, así que en arm64 esa ruta no existiría y rompería cualquier comando que dependa de$JAVA_HOME(Android SDK, Gradle, etc.).docker-composev1.21.2 descargado como binario fijo (Dockerfile:76-80) desdehttps://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m)— se confirmó por búsqueda web que esa versión (2018) nunca publicó binario paraaarch64/arm64; elRUNfallaría al construir en esa plataforma.
Decisiones ya acordadas con el usuario:
- docker-compose: eliminar la descarga manual del binario v1 y confiar en el plugin Compose V2
(
docker compose, con espacio) que el script deget.docker.comya instala automáticamente y que sí soporta ambas arquitecturas nativamente. Agregar un wrapper/usr/local/bin/docker-composeque delegue adocker compose "$@", para no romper scripts existentes que usan el nombre con guion. - Android SDK (
platform-tools,build-tools,emulatorinstalados víasdkmanager,Dockerfile:130-131): Google solo distribuye binarios nativos oficiales para Linux x86_64. El build en sí no falla en arm64 (sdkmanagersolo descarga/descomprime, no ejecuta los binarios), pero en un Mac M corriendo la imagen arm64 nativa,adb/aapt2/emulatorprobablemente no ejecutarán. Se deja la instalación igual en ambas arquitecturas y se documenta la limitación en el README (mitigación: correr ese contenedor puntual con--platform linux/amd64cuando se necesite Android).
El resto de las instalaciones del Dockerfile (GitHub CLI, kubectl, Flux CLI, NVM/Node, Emscripten,
Claude Code, Conan) ya son multi-arch (usan $(dpkg --print-architecture), scripts oficiales que
autodetectan arquitectura, o son artefactos JVM/Python agnósticos de arquitectura) — no requieren
cambios.
Cambios
1. Dockerfile
- Justo antes de
ENV JAVA_HOME=...(línea 106), declararARG TARGETARCH(buildx lo puebla automáticamente por plataforma; sus valoresamd64/arm64coinciden con el naming de Debian) y cambiar la línea a:ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-${TARGETARCH} - En el bloque de configuración de
~/.bashrc(línea ~160), reemplazar el valor hardcodeado por la variable ya resuelta:RUN echo "export JAVA_HOME=$JAVA_HOME" | sudo tee -a ~/.bashrc - Eliminar el bloque de instalación manual de
docker-composev1 (líneas 76-80). - Después de instalar Docker (que ya trae
docker-compose-plugin), agregar un wrapper de compatibilidad:RUN sudo printf '#!/bin/sh\nexec docker compose "$@"\n' | sudo tee /usr/local/bin/docker-compose > /dev/null \ && sudo chmod +x /usr/local/bin/docker-compose
2. .gitea/workflows/main-workflow.yml
- Agregar el paso
docker/setup-qemu-action@v3(antes dedocker/setup-buildx-action@v3), para garantizar emulación arm64 en el runner de Gitea Actions aunque no traiga QEMU/binfmt preregistrado (a diferencia de runners hosteados de GitHub). - Cambiar
platforms: linux/amd64(línea 85) aplatforms: linux/amd64,linux/arm64.
3. README.md
- Bump de versión siguiendo la convención existente del repo (cada commit incrementa la versión):
1.1.0→1.2.0. - Agregar una nota breve documentando la limitación de Android SDK en arm64 y la mitigación
(
--platform linux/amd64cuando se necesiteadb/aapt2/emulatorfuncionales).
Verificación
- Build local multi-plataforma sin push, solo para validar que ambos targets compilan:
docker buildx build --platform linux/amd64,linux/arm64 -t vscode-server:test --output=type=cacheonly . - Si hace falta cargar y probar arm64 localmente en una máquina x86 (requiere QEMU registrado,
p.ej.
docker run --privileged --rm tonistiigi/binfmt --install all):docker buildx build --platform linux/arm64 -t vscode-server:arm64 --load . docker run --rm --platform linux/arm64 vscode-server:arm64 bash -lc 'echo $JAVA_HOME && java -version && docker compose version && docker-compose version' - Push a
master(oworkflow_dispatch) y confirmar en Gitea Actions que el jobbuild-and-pushtermina en verde para ambas plataformas. - Verificar el manifest multi-arch publicado:
y confirmar que aparecen entradas para
docker manifest inspect gitea.p-lao.com/aleleba/vscode-server:latestlinux/amd64ylinux/arm64.