<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Erick Eduardo Ramos</title>
    <description>The latest articles on DEV Community by Erick Eduardo Ramos (@erickeduardoramos03).</description>
    <link>https://dev.to/erickeduardoramos03</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3943545%2Ff8b96fcc-b7e6-4c21-a809-3c6ffedaea58.png</url>
      <title>DEV Community: Erick Eduardo Ramos</title>
      <link>https://dev.to/erickeduardoramos03</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/erickeduardoramos03"/>
    <language>en</language>
    <item>
      <title>Cómo solucionar `docker run` con `Exited (1)` en Raspberry Pi</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Thu, 02 Jul 2026 11:28:50 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exited-1-en-raspberry-pi-1b0j</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exited-1-en-raspberry-pi-1b0j</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar &lt;code&gt;docker run&lt;/code&gt; con &lt;code&gt;Exited (1)&lt;/code&gt; en Raspberry Pi
&lt;/h1&gt;

&lt;p&gt;El error &lt;code&gt;Exited (1)&lt;/code&gt; indica que el proceso principal del contenedor terminó con un código de salida no cero (error). En Raspberry Pi, este problema es &lt;strong&gt;especialmente común&lt;/strong&gt; cuando se ejecutan contenedores construidos para arquitecturas x86/x64 en un sistema ARM (Raspberry Pi usa CPU ARM). La causa raíz más probable es una &lt;strong&gt;incompatibilidad de arquitectura de CPU&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué ocurre?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tu imagen &lt;code&gt;myimage&lt;/code&gt; probablemente fue construida para arquitectura &lt;code&gt;amd64&lt;/code&gt; (x86_64), pero Raspberry Pi usa &lt;code&gt;arm32v7&lt;/code&gt; o &lt;code&gt;arm64v8&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cuando Docker intenta ejecutar un binario x86 en ARM sin emulación, el kernel lanza una excepción &lt;code&gt;SIGILL&lt;/code&gt; (instrucción ilegal), causando que el proceso salga con código 1.&lt;/li&gt;
&lt;li&gt;El hecho de que funcione en una VM de Raspberry Pi (probablemente una VM x86) confirma esta hipótesis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pasos para solucionarlo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Verifica la arquitectura de tu Raspberry Pi y de la imagen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# En tu Raspberry Pi:&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;span class="c"&gt;# Salida esperada: armv7l (Raspberry Pi 3/4 32-bit) o aarch64 (Raspberry Pi 4 64-bit)&lt;/span&gt;

&lt;span class="c"&gt;# Verifica la arquitectura de tu imagen:&lt;/span&gt;
docker inspect myimage | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; architecture
&lt;span class="c"&gt;# O mejor aún:&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; tonistiigi/binfmt &lt;span class="nt"&gt;--version&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--privileged&lt;/span&gt; multiarch/qemu-user-static &lt;span class="nt"&gt;--reset&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Usa QEMU para emulación (si no puedes reconstruir la imagen)
&lt;/h3&gt;

&lt;p&gt;Instala soporte de emulación multiarquitectura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; qemu-user-static binfmt-support
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--privileged&lt;/span&gt; multiarch/qemu-user-static &lt;span class="nt"&gt;--reset&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego ejecuta tu contenedor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Nota: La emulación es lenta y puede causar problemas de estabilidad en producción.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Solución definitiva: Reconstruye la imagen para ARM
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Opción A: Usa &lt;code&gt;docker buildx&lt;/code&gt; desde tu máquina de desarrollo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crea un builder con soporte multiarquitectura&lt;/span&gt;
docker buildx create &lt;span class="nt"&gt;--name&lt;/span&gt; mybuilder &lt;span class="nt"&gt;--use&lt;/span&gt;

&lt;span class="c"&gt;# Inicia el builder&lt;/span&gt;
docker buildx inspect &lt;span class="nt"&gt;--bootstrap&lt;/span&gt;

&lt;span class="c"&gt;# Construye e impulsa la imagen para ARM&lt;/span&gt;
docker buildx build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm/v7,linux/arm64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--push&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; tu-usuario/myimage:latest &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Opción B: Construye directamente en Raspberry Pi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si tienes acceso físico a la Raspberry Pi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Asegúrate de tener Docker CE instalado (no Docker.io del repositorio de Debian)&lt;/span&gt;
curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://get.docker.com | sh

&lt;span class="c"&gt;# Construye localmente&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; myimage &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Verifica el log del contenedor
&lt;/h3&gt;

&lt;p&gt;Si el problema persiste, revisa el log:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-t&lt;/span&gt; myimage  &lt;span class="c"&gt;# Ejecuta sin -d para ver logs en consola&lt;/span&gt;
&lt;span class="c"&gt;# O después de un fallo:&lt;/span&gt;
docker logs &amp;lt;container_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bloque de código corregido (ejemplo funcional)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Paso 1: Instalar soporte multiarquitectura (si no puedes reconstruir)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; qemu-user-static binfmt-support
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--privileged&lt;/span&gt; multiarch/qemu-user-static &lt;span class="nt"&gt;--reset&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;yes&lt;/span&gt;

&lt;span class="c"&gt;# Paso 2: Ejecutar con la red host (sin espacios en `--net=host`)&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage

&lt;span class="c"&gt;# Paso 3: Verificar estado&lt;/span&gt;
docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;
docker logs &amp;lt;ID_CONTENEDOR&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pro-tip
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nunca uses &lt;code&gt;--net = host&lt;/code&gt;&lt;/strong&gt; (con espacios). Docker interpretará &lt;code&gt;=&lt;/code&gt; como parte del valor del flag, causando errores silenciosos. Usa siempre &lt;code&gt;--net=host&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;En Raspberry Pi, &lt;strong&gt;evita imágenes oficiales de Docker Hub que solo publiquen &lt;code&gt;amd64&lt;/code&gt;&lt;/strong&gt;. Busca variantes con sufijo &lt;code&gt;arm32v7&lt;/code&gt;, &lt;code&gt;arm64v8&lt;/code&gt;, o usa imágenes que publiquen manifiestos multiarquitectura (ej: &lt;code&gt;node:18-alpine&lt;/code&gt; sí lo hace, &lt;code&gt;node:18&lt;/code&gt; por defecto no).&lt;/li&gt;
&lt;li&gt;Para imágenes personalizadas, &lt;strong&gt;siempre construye con &lt;code&gt;docker buildx&lt;/code&gt;&lt;/strong&gt; para garantizar compatibilidad multiplataforma.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Verificación final&lt;/strong&gt;: Si el contenedor arranca y se mantiene en ejecución (no &lt;code&gt;Exited (1)&lt;/code&gt;), y &lt;code&gt;docker ps&lt;/code&gt; lo muestra como &lt;code&gt;Up X seconds&lt;/code&gt;, el problema está resuelto.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>debugging</category>
      <category>docker</category>
      <category>iot</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar el error de permiso al ejecutar `pip.exe` en un entorno virtual de Python en Windows</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Wed, 01 Jul 2026 11:55:48 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-error-de-permiso-al-ejecutar-pipexe-en-un-entorno-virtual-de-python-en-windows-4l01</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-error-de-permiso-al-ejecutar-pipexe-en-un-entorno-virtual-de-python-en-windows-4l01</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el error de permiso al ejecutar &lt;code&gt;pip.exe&lt;/code&gt; en un entorno virtual de Python en Windows
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ¿Por qué ocurre este error?
&lt;/h2&gt;

&lt;p&gt;El problema no está en los permisos del archivo &lt;code&gt;pip.exe&lt;/code&gt; (como confirmó &lt;code&gt;icacls&lt;/code&gt;), sino en que &lt;strong&gt;el lanzador &lt;code&gt;pip.exe&lt;/code&gt; está corrupto o desactualizado&lt;/strong&gt;. Este archivo es un &lt;em&gt;stub&lt;/em&gt; empaquetado con una ruta fija a &lt;code&gt;python.exe&lt;/code&gt; y un script interno (&lt;code&gt;__main__.py&lt;/code&gt;). Cuando se crea el entorno virtual, &lt;code&gt;pip.exe&lt;/code&gt; se genera con la ruta a la versión de Python usada en ese momento. Si esa versión de Python fue desinstalada o movida (como sucedió tras instalar/desinstalar múltiples versiones), el lanzador sigue apuntando a una ruta inválida → &lt;strong&gt;"Access is denied"&lt;/strong&gt; al intentar ejecutarlo.&lt;/p&gt;

&lt;p&gt;Esto es especialmente común tras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cambiar versiones de Python (instalar/desinstalar múltiples veces).&lt;/li&gt;
&lt;li&gt;Usar instaladores de Python que no limpian correctamente rutas antiguas.&lt;/li&gt;
&lt;li&gt;Mover o renombrar directorios del sistema o del usuario.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solución definitiva (pasos verificados)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Elimina el lanzador corrupto de &lt;code&gt;pip.exe&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Desde la raíz del entorno virtual (venv)&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;Scripts&lt;span class="se"&gt;\p&lt;/span&gt;ip.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Importante&lt;/strong&gt;: No uses &lt;code&gt;del&lt;/code&gt; en PowerShell si el archivo está bloqueado. Cierra todas las terminales y editores antes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Regenera &lt;code&gt;pip.exe&lt;/code&gt; usando el lanzador correcto
&lt;/h3&gt;

&lt;p&gt;Ejecuta &lt;strong&gt;desde la raíz del entorno virtual&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Asegura que estés en el directorio del venv&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;username&amp;gt;&lt;span class="se"&gt;\&amp;lt;&lt;/span&gt;project &lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\v&lt;/span&gt;&lt;span class="nb"&gt;env&lt;/span&gt;

&lt;span class="c"&gt;# Ejecuta el script de instalación de pip desde python.exe (no desde pip.exe)&lt;/span&gt;
Scripts&lt;span class="se"&gt;\p&lt;/span&gt;ython.exe &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip &lt;span class="nt"&gt;--force-reinstall&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto regenerará &lt;code&gt;Scripts\pip.exe&lt;/code&gt; con la ruta correcta a &lt;code&gt;Scripts\python.exe&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Verifica que el lanzador funcione
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Scripts&lt;span class="se"&gt;\p&lt;/span&gt;ip.exe &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Salida esperada:&lt;br&gt;&lt;br&gt;
&lt;code&gt;pip 23.x.x from C:\...\venv\lib\site-packages\pip (python 3.10)&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Bloque de código corregido (script de verificación automática)
&lt;/h2&gt;

&lt;p&gt;Guarda como &lt;code&gt;fix_pip_launcher.bat&lt;/code&gt; y ejecuta &lt;strong&gt;como administrador si es necesario&lt;/strong&gt; (aunque normalmente no lo es):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;@echo &lt;span class="na"&gt;off&lt;/span&gt;
&lt;span class="nb"&gt;setlocal&lt;/span&gt; &lt;span class="na"&gt;enabledelayedexpansion&lt;/span&gt;

&lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="s2"&gt;"VENV_DIR=&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="s2"&gt;~1"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%VENV_DIR%&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="s2"&gt;"VENV_DIR=&lt;/span&gt;&lt;span class="nv"&gt;%cd%&lt;/span&gt;&lt;span class="s2"&gt;\venv"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;exist&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%VENV_DIR%&lt;/span&gt;&lt;span class="s2"&gt;\Scripts\python.exe"&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="kd"&gt;ERROR&lt;/span&gt;: &lt;span class="kd"&gt;No&lt;/span&gt; &lt;span class="kd"&gt;se&lt;/span&gt; &lt;span class="kd"&gt;encontr&lt;/span&gt;ó &lt;span class="kd"&gt;python&lt;/span&gt;&lt;span class="err"&gt;.exe&lt;/span&gt; &lt;span class="kd"&gt;en&lt;/span&gt; &lt;span class="nv"&gt;%VENV_DIR%&lt;/span&gt;\Scripts\
    &lt;span class="k"&gt;exit&lt;/span&gt; &lt;span class="na"&gt;/b &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/3&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="kd"&gt;Eliminando&lt;/span&gt; &lt;span class="kd"&gt;pip&lt;/span&gt;&lt;span class="err"&gt;.exe&lt;/span&gt; &lt;span class="kd"&gt;corrupto&lt;/span&gt;...
&lt;span class="nb"&gt;del&lt;/span&gt; &lt;span class="na"&gt;/f /q &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%VENV_DIR%&lt;/span&gt;&lt;span class="s2"&gt;\Scripts\pip.exe"&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kr"&gt;nul&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;/3&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="kd"&gt;Regenerando&lt;/span&gt; &lt;span class="kd"&gt;pip&lt;/span&gt;&lt;span class="err"&gt;.exe&lt;/span&gt; &lt;span class="kr"&gt;con&lt;/span&gt; &lt;span class="kd"&gt;la&lt;/span&gt; &lt;span class="kd"&gt;ruta&lt;/span&gt; &lt;span class="kd"&gt;correcta&lt;/span&gt;...
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%VENV_DIR%&lt;/span&gt;&lt;span class="s2"&gt;\Scripts\python.exe"&lt;/span&gt; &lt;span class="na"&gt;-m &lt;/span&gt;&lt;span class="kd"&gt;pip&lt;/span&gt; &lt;span class="kd"&gt;install&lt;/span&gt; &lt;span class="na"&gt;--upgrade &lt;/span&gt;&lt;span class="kd"&gt;pip&lt;/span&gt; &lt;span class="na"&gt;--force-reinstall --no-warn-script-location &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="kr"&gt;nul&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/3&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="kd"&gt;Verificando&lt;/span&gt; &lt;span class="kd"&gt;lanzador&lt;/span&gt;...
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;%VENV_DIR%&lt;/span&gt;&lt;span class="s2"&gt;\Scripts\pip.exe"&lt;/span&gt; &lt;span class="na"&gt;--version
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;%errorlevel%&lt;/span&gt; &lt;span class="ow"&gt;equ&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; ✅ ¡Lanzador &lt;span class="kd"&gt;pip&lt;/span&gt;&lt;span class="err"&gt;.exe&lt;/span&gt; &lt;span class="kd"&gt;reparado&lt;/span&gt; &lt;span class="kd"&gt;correctamente&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; ❌ &lt;span class="kd"&gt;Error&lt;/span&gt;: &lt;span class="kd"&gt;El&lt;/span&gt; &lt;span class="kd"&gt;lanzador&lt;/span&gt; &lt;span class="kd"&gt;sigue&lt;/span&gt; &lt;span class="kd"&gt;fallando&lt;/span&gt;. &lt;span class="kd"&gt;Reinstala&lt;/span&gt; &lt;span class="kd"&gt;el&lt;/span&gt; &lt;span class="kd"&gt;entorno&lt;/span&gt; &lt;span class="kd"&gt;virtual&lt;/span&gt;.
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fix_pip_launcher.bat &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\U&lt;/span&gt;&lt;span class="s2"&gt;sers&lt;/span&gt;&lt;span class="se"&gt;\v&lt;/span&gt;&lt;span class="s2"&gt;anessa&lt;/span&gt;&lt;span class="se"&gt;\m&lt;/span&gt;&lt;span class="s2"&gt;yproject&lt;/span&gt;&lt;span class="se"&gt;\v&lt;/span&gt;&lt;span class="s2"&gt;env"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pro-tip: Evita el problema en el futuro
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Usa siempre &lt;code&gt;python -m pip&lt;/code&gt; en entornos virtuales
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# En lugar de:&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Usa:&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto &lt;strong&gt;evita usar el lanzador &lt;code&gt;pip.exe&lt;/code&gt;&lt;/strong&gt; y ejecuta directamente el módulo &lt;code&gt;pip&lt;/code&gt; desde el &lt;code&gt;python.exe&lt;/code&gt; del entorno, ignorando cualquier corrupción del stub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Si usas PowerShell, añade esta función a tu perfil (&lt;code&gt;$PROFILE&lt;/code&gt;):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;Args&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Para entornos nuevos, recrea el venv con &lt;code&gt;--clear&lt;/code&gt;:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Elimina el venv actual y recrea&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; venv
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv &lt;span class="nt"&gt;--clear&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🔍 &lt;strong&gt;Nota crítica&lt;/strong&gt;: El error &lt;em&gt;nunca&lt;/em&gt; es de permisos en entornos de usuario (como &lt;code&gt;C:\Users\...&lt;/code&gt;). Si &lt;code&gt;icacls&lt;/code&gt; muestra permisos normales y el lanzador falla, &lt;strong&gt;es siempre corrupción del stub&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>debugging</category>
      <category>programming</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar `docker run` con exit code 1 en Raspberry Pi</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Tue, 30 Jun 2026 11:46:34 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exit-code-1-en-raspberry-pi-46ij</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exit-code-1-en-raspberry-pi-46ij</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar &lt;code&gt;docker run&lt;/code&gt; con exit code 1 en Raspberry Pi
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ¿Por qué ocurre este error?
&lt;/h2&gt;

&lt;p&gt;El código de salida &lt;code&gt;1&lt;/code&gt; indica que el proceso principal del contenedor terminó con un error genérico. En Raspberry Pi, los casos más comunes son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arquitectura incompatible&lt;/strong&gt;: La imagen fue construida para &lt;code&gt;amd64&lt;/code&gt; (x86_64), pero Raspberry Pi usa &lt;code&gt;arm32v7&lt;/code&gt; o &lt;code&gt;arm64v8&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falta de binarios compatibles&lt;/strong&gt;: El &lt;code&gt;ENTRYPOINT&lt;/code&gt; o &lt;code&gt;CMD&lt;/code&gt; del contenedor intenta ejecutar un binario incompatible con ARM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problemas de permisos o recursos&lt;/strong&gt;: Especialmente en entornos headless o con configuraciones de red restrictivas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uso incorrecto de &lt;code&gt;--net=host&lt;/code&gt;&lt;/strong&gt;: En Raspberry Pi con ciertas versiones de Docker o sistemas operativos (como Raspberry Pi OS), puede causar fallos silenciosos.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🔍 &lt;strong&gt;Nota crítica&lt;/strong&gt;: En tu comando &lt;code&gt;docker run --net = host&lt;/code&gt;, hay espacios alrededor del &lt;code&gt;=&lt;/code&gt;. Esto es inválido y causa un error de parsing. Docker interpreta &lt;code&gt;--net&lt;/code&gt; como &lt;code&gt;--net =&lt;/code&gt;, lo que probablemente falla antes de ejecutar el contenedor.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Pasos para solucionarlo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Corrige el comando: elimina espacios en &lt;code&gt;--net=host&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ❌ INCORRECTO (con espacios)&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage

&lt;span class="c"&gt;# ✅ CORRECTO (sin espacios)&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Importante&lt;/strong&gt;: En Docker CLI, los argumentos con &lt;code&gt;=&lt;/code&gt; no deben tener espacios. &lt;code&gt;--net=host&lt;/code&gt; es obligatorio.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. Verifica la arquitectura de la imagen y del host
&lt;/h3&gt;

&lt;p&gt;Ejecuta en tu Raspberry Pi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verifica arquitectura del host&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;

&lt;span class="c"&gt;# Verifica arquitectura de la imagen&lt;/span&gt;
docker inspect myimage &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Architecture}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el resultado de &lt;code&gt;docker inspect&lt;/code&gt; es &lt;code&gt;amd64&lt;/code&gt;, pero tu Raspberry Pi es &lt;code&gt;armv7l&lt;/code&gt; o &lt;code&gt;aarch64&lt;/code&gt;, &lt;strong&gt;la imagen no es compatible&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Construye o descarga una imagen ARM-compatible
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Opción A: Usa imágenes oficiales con soporte multi-arquitectura
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ejemplo: imagen oficial de Nginx con soporte ARM&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 arm32v7/nginx:latest
&lt;span class="c"&gt;# o para ARM64&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 arm64v8/nginx:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Opción B: Reconstruye la imagen desde tu Raspberry Pi
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clona tu repo y construye localmente&lt;/span&gt;
git clone &amp;lt;tu-repo&amp;gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;tu-proyecto&amp;gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; myimage &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Opción C: Usa &lt;code&gt;buildx&lt;/code&gt; para construir multi-arch desde otra máquina
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx create &lt;span class="nt"&gt;--use&lt;/span&gt;
docker buildx build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm/v7 &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:arm &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--push&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4. Ejecuta en primer plano para depurar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Elimina -d para ver logs en tiempo real&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si ves errores como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;standard_init_linux.go:211: exec user process caused: no such file or directory&lt;/code&gt; → Falta binario o arquitectura incompatible.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;standard_init_linux.go:228: exec user process caused: exec format error&lt;/code&gt; → Binario x86 ejecutándose en ARM.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Verifica permisos y recursos en Raspberry Pi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Asegúrate de que el usuario esté en el grupo &lt;code&gt;docker&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
  &lt;span class="c"&gt;# Luego reinicia sesión o ejecuta: newgrp docker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Verifica espacio en disco:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; /var/lib/docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Si usas &lt;code&gt;--net=host&lt;/code&gt;, prueba sin él primero:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage  &lt;span class="c"&gt;# sin red host&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bloque de código corregido (caso típico)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Verifica arquitectura&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;  &lt;span class="c"&gt;# Debe coincidir con la arquitectura de la imagen&lt;/span&gt;

&lt;span class="c"&gt;# 2. Ejecuta sin errores de parsing y en primer plano para depurar&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; myimage

&lt;span class="c"&gt;# 3. Si falla por arquitectura, usa imagen ARM&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; arm32v7/myimage  &lt;span class="c"&gt;# o arm64v8/myimage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pro-tip: Diagnóstico rápido con &lt;code&gt;docker events&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Abre una terminal nueva y ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker events &lt;span class="nt"&gt;--filter&lt;/span&gt; &lt;span class="nv"&gt;event&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;die
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego ejecuta tu contenedor. Verás en tiempo real el código de salida y causa del fallo.&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;Solución definitiva&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Corrige &lt;code&gt;--net = host&lt;/code&gt; → &lt;code&gt;--net=host&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;asegura compatibilidad de arquitectura&lt;/strong&gt;. El 90% de los casos en Raspberry Pi se resuelven así.&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>docker</category>
      <category>iot</category>
      <category>linux</category>
    </item>
    <item>
      <title>Cómo solucionar `docker run` con error `Exited (1)` en Raspberry Pi</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Mon, 29 Jun 2026 13:01:01 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-error-exited-1-en-raspberry-pi-3779</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-error-exited-1-en-raspberry-pi-3779</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar &lt;code&gt;docker run&lt;/code&gt; con error &lt;code&gt;Exited (1)&lt;/code&gt; en Raspberry Pi
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ¿Por qué ocurre este error?
&lt;/h2&gt;

&lt;p&gt;El código de salida &lt;code&gt;1&lt;/code&gt; indica que el proceso principal del contenedor terminó con un error genérico. En Raspberry Pi, los casos más comunes son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arquitectura incompatible&lt;/strong&gt;: La imagen se construyó para &lt;code&gt;amd64&lt;/code&gt; pero se ejecuta en ARM (&lt;code&gt;armv7l&lt;/code&gt; o &lt;code&gt;aarch64&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falta de binarios compatibles&lt;/strong&gt;: El &lt;code&gt;ENTRYPOINT&lt;/code&gt; o &lt;code&gt;CMD&lt;/code&gt; del contenedor no existe o no es ejecutable en ARM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problemas de permisos o dependencias faltantes&lt;/strong&gt; (como librerías &lt;code&gt;.so&lt;/code&gt; específicas de ARM).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uso de flags inválidos en comandos&lt;/strong&gt;: En tu caso, &lt;code&gt;--net = host&lt;/code&gt; tiene espacios incorrectos (&lt;code&gt;--net = host&lt;/code&gt; → &lt;code&gt;--net host&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🔍 &lt;strong&gt;Nota crítica&lt;/strong&gt;: El error no es del entorno Docker en sí (ya que funciona en la VM), sino de la &lt;strong&gt;incompatibilidad arquitectónica o de dependencias&lt;/strong&gt; entre la imagen y el hardware físico.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Pasos para solucionarlo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Verifica la arquitectura de tu Raspberry Pi
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;span class="c"&gt;# Salida esperada: armv7l (Raspberry Pi 3/4 32-bit) o aarch64 (Raspberry Pi 4/5 64-bit)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Verifica la arquitectura de tu imagen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect myimage &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Architecture}}'&lt;/span&gt;
&lt;span class="c"&gt;# Si muestra "amd64" y tu Pi es ARM, la imagen es incompatible.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Corrige el comando (¡error crítico en la sintaxis!)
&lt;/h3&gt;

&lt;p&gt;Tu comando actual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;span class="c"&gt;# ❌ ERROR: espacios alrededor del "=" en "--net = host"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Comando corregido&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;span class="c"&gt;# O mejor aún (para depurar):&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;code&gt;--net = host&lt;/code&gt; es inválido. Docker interpreta &lt;code&gt;=&lt;/code&gt; como parte del valor del flag, causando error de parsing y terminación inmediata.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. Ejecuta en primer plano para ver el error real
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto mostrará el stack trace o mensaje de error que te dirá &lt;strong&gt;por qué&lt;/strong&gt; falla (ej: &lt;code&gt;exec format error&lt;/code&gt;, &lt;code&gt;segmentation fault&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Si la imagen es incompatible con ARM: reconstrúyela para Raspberry Pi
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Opción A: Usa &lt;code&gt;buildx&lt;/code&gt; para multi-arquitectura
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crea un builder con soporte multi-arch&lt;/span&gt;
docker buildx create &lt;span class="nt"&gt;--use&lt;/span&gt;

&lt;span class="c"&gt;# Construye e impulsa para ARM y amd64&lt;/span&gt;
docker buildx build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm/v7,linux/amd64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:latest &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--push&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Opción B: Construye directamente en el Pi
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# En tu Raspberry Pi:&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:arm &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:arm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Opción C: Usa imágenes oficiales con soporte ARM
&lt;/h4&gt;

&lt;p&gt;Busca imágenes con etiquetas como &lt;code&gt;arm32v7/&lt;/code&gt;, &lt;code&gt;arm64v8/&lt;/code&gt; o &lt;code&gt;--platform linux/arm/v7&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; arm32v7/nginx:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bloque de código corregido (caso típico)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Verifica arquitectura&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;

&lt;span class="c"&gt;# 2. Corrige el comando (¡sin espacios en los flags!)&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; myimage

&lt;span class="c"&gt;# 3. Si falla con "exec format error", reconstruye para ARM:&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:arm &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:arm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pro-tip: Diagnóstico rápido con &lt;code&gt;strace&lt;/code&gt; (si la imagen lo permite)
&lt;/h2&gt;

&lt;p&gt;Si tienes acceso al Dockerfile, agrega &lt;code&gt;strace&lt;/code&gt; para depurar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; strace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; myimage strace &lt;span class="nt"&gt;-f&lt;/span&gt; /bin/sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"exec your_command"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto revelará &lt;strong&gt;exactamente qué syscall falla&lt;/strong&gt; (ej: &lt;code&gt;open("/lib/libssl.so.1.0.0", O_RDONLY) = -1 ENOENT&lt;/code&gt; → librería faltante).&lt;/p&gt;

</description>
      <category>docker</category>
      <category>linux</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar el error de permisos al ejecutar `pip.exe` en un entorno virtual de Python (Windows)</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Sun, 28 Jun 2026 11:01:51 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-error-de-permisos-al-ejecutar-pipexe-en-un-entorno-virtual-de-python-windows-4o9p</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-error-de-permisos-al-ejecutar-pipexe-en-un-entorno-virtual-de-python-windows-4o9p</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el error de permisos al ejecutar &lt;code&gt;pip.exe&lt;/code&gt; en un entorno virtual de Python (Windows)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ¿Por qué ocurre este error?
&lt;/h2&gt;

&lt;p&gt;El problema no es un error de permisos tradicional (como falta de ACL o propiedad incorrecta), sino una &lt;strong&gt;corrupción o inconsistencia en el &lt;em&gt;launcher&lt;/em&gt; &lt;code&gt;pip.exe&lt;/code&gt;&lt;/strong&gt; dentro del entorno virtual. Este archivo es un &lt;em&gt;stub&lt;/em&gt; empaquetado que contiene una ruta fija a &lt;code&gt;python.exe&lt;/code&gt; y un script &lt;code&gt;__main__.py&lt;/code&gt; embebido. Cuando se crea el entorno virtual, &lt;code&gt;pip.exe&lt;/code&gt; se genera apuntando a la versión específica de Python usada en ese momento.&lt;/p&gt;

&lt;p&gt;Si:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se instalan/desinstalan múltiples versiones de Python (especialmente desde distintas fuentes: python.org, Microsoft Store),&lt;/li&gt;
&lt;li&gt;Se mueve o copia el entorno virtual,&lt;/li&gt;
&lt;li&gt;Hay conflictos de rutas en el &lt;code&gt;PATH&lt;/code&gt; o se usa una versión de Python distinta a la del momento de creación del entorno,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...entonces &lt;code&gt;pip.exe&lt;/code&gt; puede quedar referenciando a un &lt;code&gt;python.exe&lt;/code&gt; que ya no existe o que ya no es accesible (por ejemplo, eliminado, movido o bloqueado por permisos de archivo abierto).&lt;/p&gt;

&lt;p&gt;El error &lt;code&gt;"Access is denied."&lt;/code&gt; al ejecutar directamente &lt;code&gt;pip.exe&lt;/code&gt; desde CMD (aunque &lt;code&gt;python -m pip&lt;/code&gt; funcione) es la firma clásica de este problema.&lt;/p&gt;




&lt;h2&gt;
  
  
  Solución definitiva
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Paso 1: Verifica si el problema es el launcher
&lt;/h3&gt;

&lt;p&gt;Ejecuta en &lt;strong&gt;CMD (no en bash)&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"C:\Users\&amp;lt;tu-usuario&amp;gt;\&amp;lt;tu-proyecto&amp;gt;\venv\Scripts\pip.exe" -V
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si obtienes &lt;code&gt;"Access is denied."&lt;/code&gt;, el launcher está corrupto o desactualizado.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Paso 2: Regenera &lt;code&gt;pip.exe&lt;/code&gt; correctamente
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No copies ni muevas el entorno virtual.&lt;/strong&gt; En su lugar, recrea los &lt;em&gt;launchers&lt;/em&gt; con la versión correcta de Python:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Desactiva&lt;/strong&gt; cualquier entorno virtual activo.&lt;/li&gt;
&lt;li&gt;Abre &lt;strong&gt;CMD como administrador&lt;/strong&gt; (solo para asegurar permisos, no es obligatorio si tu usuario tiene control total).&lt;/li&gt;
&lt;li&gt;Ejecuta:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   python -m venv --upgrade "C:\Users\&amp;lt;tu-usuario&amp;gt;\&amp;lt;tu-proyecto&amp;gt;\venv"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Esto regenera todos los &lt;em&gt;launchers&lt;/em&gt; (&lt;code&gt;pip.exe&lt;/code&gt;, &lt;code&gt;pythonw.exe&lt;/code&gt;, etc.) usando la versión de Python que esté en tu &lt;code&gt;PATH&lt;/code&gt; actual.&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Importante&lt;/strong&gt;: Asegúrate de que el &lt;code&gt;python&lt;/code&gt; que ejecuta este comando sea &lt;strong&gt;exactamente el mismo&lt;/strong&gt; que usaste al crear el entorno (o el que deseas usar ahora). Verifica con &lt;code&gt;where python&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ✅ Paso 3: Verifica que funcione
&lt;/h3&gt;

&lt;p&gt;Ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"C:\Users\&amp;lt;tu-usuario&amp;gt;\&amp;lt;tu-proyecto&amp;gt;\venv\Scripts\pip.exe" --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Debería mostrar algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip 23.2.1 from C:\Users\&amp;lt;usuario&amp;gt;\&amp;lt;proyecto&amp;gt;\venv\Lib\site-packages\pip (python 3.10)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Paso 4: Usa &lt;code&gt;python -m pip&lt;/code&gt; como fallback (recomendado)
&lt;/h3&gt;

&lt;p&gt;Aunque el launcher esté arreglado, &lt;strong&gt;evita usar &lt;code&gt;pip&lt;/code&gt; directamente&lt;/strong&gt; en entornos virtuales en Windows. Usa siempre:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto garantiza que se use el &lt;code&gt;pip&lt;/code&gt; asociado al &lt;code&gt;python&lt;/code&gt; del entorno, sin depender del &lt;em&gt;launcher&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bloque de código corregido (para automatizar)
&lt;/h2&gt;

&lt;p&gt;Si necesitas una solución rápida y repetible (por ejemplo, en scripts CI/CD o al reiniciar un entorno):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:: Elimina los launchers corruptos y regenera
rmdir /S /Q "C:\Users\&amp;lt;usuario&amp;gt;\&amp;lt;proyecto&amp;gt;\venv"
python -m venv "C:\Users\&amp;lt;usuario&amp;gt;\&amp;lt;proyecto&amp;gt;\venv"
call "C:\Users\&amp;lt;usuario&amp;gt;\&amp;lt;proyecto&amp;gt;\venv\Scripts\activate.bat"
python -m pip install --upgrade pip setuptools wheel
python -m pip install -e .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Nota&lt;/strong&gt;: &lt;code&gt;rmdir /S /Q&lt;/code&gt; es más seguro que borrar solo &lt;code&gt;Scripts\pip.exe&lt;/code&gt;, porque evita inconsistencias en otros launchers (&lt;code&gt;easy_install&lt;/code&gt;, &lt;code&gt;pydoc&lt;/code&gt;, etc.).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Pro-tip: Evita este problema a largo plazo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Nunca mezcles fuentes de Python&lt;/strong&gt; (python.org + Microsoft Store). Usa una sola instalación oficial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evita mover o copiar entornos virtuales&lt;/strong&gt;. Si necesitas portabilidad, usa &lt;code&gt;pip freeze &amp;gt; requirements.txt&lt;/code&gt; y recrea el entorno en el destino.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usa &lt;code&gt;py -3.10 -m venv venv&lt;/code&gt;&lt;/strong&gt; para asegurar que se use la versión exacta de Python deseada (ej. &lt;code&gt;py -3.10&lt;/code&gt; es el launcher de Python 3.10).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;En entornos corporativos&lt;/strong&gt;, verifica si políticas de seguridad (como AppLocker o Windows Defender Application Control) bloquean ejecución de archivos empaquetados (como &lt;code&gt;pip.exe&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Conclusión&lt;/strong&gt;: El problema no es de permisos del archivo, sino de &lt;strong&gt;inconsistencia interna del launcher&lt;/strong&gt;. La solución es regenerarlo con &lt;code&gt;python -m venv --upgrade&lt;/code&gt;, y usar &lt;code&gt;python -m pip&lt;/code&gt; como práctica estándar.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar `docker run` con `Exited (1)` en Raspberry Pi</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Sat, 27 Jun 2026 10:54:39 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exited-1-en-raspberry-pi-2a2d</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exited-1-en-raspberry-pi-2a2d</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar &lt;code&gt;docker run&lt;/code&gt; con &lt;code&gt;Exited (1)&lt;/code&gt; en Raspberry Pi
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ¿Por qué ocurre este error?
&lt;/h2&gt;

&lt;p&gt;El código de salida &lt;code&gt;1&lt;/code&gt; indica que el proceso principal del contenedor terminó con un error genérico. En Raspberry Pi, los casos más comunes son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arquitectura incompatible&lt;/strong&gt;: La imagen fue construida para &lt;code&gt;amd64&lt;/code&gt; (x86_64) pero el Raspberry Pi usa &lt;code&gt;arm32v7&lt;/code&gt; o &lt;code&gt;arm64v8&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problemas con el comando inicial&lt;/strong&gt;: El &lt;code&gt;CMD&lt;/code&gt; o &lt;code&gt;ENTRYPOINT&lt;/code&gt; de la imagen falla al ejecutarse en el entorno del Pi (por ejemplo, falta una librería específica de ARM, o el binario no es compatible).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Espacio en disco insuficiente&lt;/strong&gt;: Raspberry Pi suele tener sistemas de archivos pequeños (especialmente en tarjetas SD).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uso incorrecto de &lt;code&gt;--net=host&lt;/code&gt;&lt;/strong&gt;: En algunas versiones de Docker en Raspberry Pi, el modo &lt;code&gt;host&lt;/code&gt; puede causar fallos si no se configura correctamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🔍 &lt;strong&gt;Nota crítica&lt;/strong&gt;: En tu comando &lt;code&gt;docker run --net = host&lt;/code&gt;, hay &lt;strong&gt;espacios alrededor del &lt;code&gt;=&lt;/code&gt;&lt;/strong&gt;. Esto es un error de sintaxis: Docker interpreta &lt;code&gt;--net&lt;/code&gt; como una opción sin valor y &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;host&lt;/code&gt; como argumentos adicionales → el contenedor falla al iniciar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Pasos para solucionarlo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Corrige la sintaxis del comando
&lt;/h3&gt;

&lt;p&gt;Elimina los espacios alrededor del &lt;code&gt;=&lt;/code&gt; en &lt;code&gt;--net=host&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Esto es lo más probable que esté causando el fallo inmediato.&lt;/strong&gt; El error de sintaxis hace que Docker no asigne la red correctamente y el contenedor falle al arrancar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. Verifica la arquitectura de la imagen
&lt;/h3&gt;

&lt;p&gt;Ejecuta en tu Raspberry Pi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect myimage &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Architecture}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Si devuelve &lt;code&gt;amd64&lt;/code&gt;, la imagen &lt;strong&gt;no es compatible&lt;/strong&gt; con Raspberry Pi (ARM).&lt;/li&gt;
&lt;li&gt;Debes reconstruir la imagen para ARM o usar una versión multiarquitectura.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Solución: Construir para ARM en Raspberry Pi
&lt;/h4&gt;

&lt;p&gt;Si tienes el &lt;code&gt;Dockerfile&lt;/code&gt;, asegúrate de construirlo en el Pi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; myimage &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O usa &lt;code&gt;buildx&lt;/code&gt; si construyes desde otra máquina:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker buildx build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm/v7 &lt;span class="nt"&gt;-t&lt;/span&gt; myimage &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Ejecuta en primer plano para diagnosticar
&lt;/h3&gt;

&lt;p&gt;Elimina &lt;code&gt;-d&lt;/code&gt; (modo &lt;em&gt;detached&lt;/em&gt;) y añade &lt;code&gt;-it&lt;/code&gt; para ver el error en tiempo real:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-it&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto mostrará el mensaje de error real (ej. &lt;code&gt;exec format error&lt;/code&gt;, &lt;code&gt;segmentation fault&lt;/code&gt;, &lt;code&gt;command not found&lt;/code&gt;, etc.).&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Verifica espacio en disco
&lt;/h3&gt;

&lt;p&gt;En Raspberry Pi, el espacio en &lt;code&gt;/var/lib/docker&lt;/code&gt; suele agotarse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; /var/lib/docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si está &amp;gt;90% usado, limpia contenedores y capas no usadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker system prune &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;--volumes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  5. Verifica versiones de Docker y kernel
&lt;/h3&gt;

&lt;p&gt;Algunas versiones de Docker en Raspberry Pi (especialmente las antiguas de &lt;code&gt;apt&lt;/code&gt;) tienen bugs conocidos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Recomendación&lt;/strong&gt;: Usa Docker CE oficial para Raspberry Pi (no el paquete de Debian/Raspbian):&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://get.docker.com &lt;span class="nt"&gt;-o&lt;/span&gt; get-docker.sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;sh get-docker.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bloque de código corregido (ejemplo funcional)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Limpieza previa&lt;/span&gt;
docker system prune &lt;span class="nt"&gt;-af&lt;/span&gt;

&lt;span class="c"&gt;# 2. Verifica arquitectura&lt;/span&gt;
docker inspect myimage &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Architecture}}'&lt;/span&gt;

&lt;span class="c"&gt;# 3. Ejecuta en primer plano para debug&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-it&lt;/span&gt; myimage

&lt;span class="c"&gt;# 4. Si falla, revisa logs&lt;/span&gt;
docker logs &amp;lt;container_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pro-Tip: Diagnóstico rápido con &lt;code&gt;strace&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Si el contenedor falla silenciosamente, inyecta &lt;code&gt;strace&lt;/code&gt; para ver qué syscall falla:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /usr/bin/strace:/usr/bin/strace:ro &lt;span class="se"&gt;\&lt;/span&gt;
  myimage &lt;span class="se"&gt;\&lt;/span&gt;
  strace &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /tmp/strace.log /bin/sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"exec your-original-cmd"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego revisa &lt;code&gt;/tmp/strace.log&lt;/code&gt; para encontrar la última llamada fallida.&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;Resultado esperado&lt;/strong&gt;: Tras corregir la sintaxis (&lt;code&gt;--net=host&lt;/code&gt; sin espacios) y asegurar arquitectura compatible, el contenedor arrancará sin &lt;code&gt;Exited (1)&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>iot</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar el bucle infinito en useEffect con objetos y arrays en React</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Fri, 26 Jun 2026 11:41:17 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-bucle-infinito-en-useeffect-con-objetos-y-arrays-en-react-1088</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-bucle-infinito-en-useeffect-con-objetos-y-arrays-en-react-1088</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el bucle infinito en useEffect con objetos y arrays en React
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Explicación técnica
&lt;/h2&gt;

&lt;p&gt;El problema ocurre porque &lt;code&gt;useEffect&lt;/code&gt; compara los valores de las dependencias usando &lt;strong&gt;comparación de referencia (&lt;code&gt;===&lt;/code&gt;)&lt;/strong&gt;, no por contenido (shallow comparison). Cuando usas &lt;code&gt;useState({})&lt;/code&gt;, cada llamada a &lt;code&gt;setObj({})&lt;/code&gt; crea un &lt;strong&gt;nuevo objeto en memoria&lt;/strong&gt;, aunque tenga el mismo contenido. React detecta que la referencia cambia (&lt;code&gt;obj !== obj&lt;/code&gt;) y vuelve a ejecutar el efecto, causando el bucle infinito.&lt;/p&gt;

&lt;p&gt;En tu caso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setObj&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setObj&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt; &lt;span class="c1"&gt;// ← ¡Nuevo objeto en memoria!&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// ← Referencia diferente → re-ejecuta efecto&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pasos para solucionarlo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Opción 1: Evitar la actualización innecesaria (recomendada)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Solo actualiza si realmente hay un cambio de estado&lt;/span&gt;
  &lt;span class="nf"&gt;setObj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Si ya está vacío, no hagas nada&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt; &lt;span class="c1"&gt;// ← Sin dependencias: solo ejecuta al montar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opción 2: Usar comparación profunda manual
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setObj&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prevObjRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Comparación profunda manual&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hasChanged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevObjRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hasChanged&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setObj&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt; &lt;span class="c1"&gt;// O la lógica que necesites&lt;/span&gt;
    &lt;span class="nx"&gt;prevObjRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opción 3: Usar &lt;code&gt;useMemo&lt;/code&gt; para mantener la misma referencia
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emptyObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({}),&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setObj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emptyObj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;emptyObj&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bloque de código corregido (solución definitiva)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;

  &lt;span class="c1"&gt;// Solución limpia: solo ejecutar efecto al montar&lt;/span&gt;
  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Tu lógica de inicialización aquí&lt;/span&gt;
    &lt;span class="c1"&gt;// Si necesitas resetear, hazlo solo una vez&lt;/span&gt;
    &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt; &lt;span class="c1"&gt;// ← Dependencia vacía: ejecuta una sola vez&lt;/span&gt;

  &lt;span class="c1"&gt;// Alternativa: función memoizada para evitar re-renders&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resetIngredients&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;// Tu JSX&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pro-tip
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nunca uses objetos/arrays literales como dependencias directas&lt;/strong&gt; (&lt;code&gt;[{}]&lt;/code&gt;, &lt;code&gt;[obj]&lt;/code&gt; donde &lt;code&gt;obj&lt;/code&gt; se redefine en cada render).&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;useCallback&lt;/code&gt; para funciones y &lt;code&gt;useMemo&lt;/code&gt; para valores complejos que necesitas como dependencias.&lt;/li&gt;
&lt;li&gt;Para objetos/arrays grandes, considera usar librerías como &lt;code&gt;fast-deep-equal&lt;/code&gt; o &lt;code&gt;react-fast-compare&lt;/code&gt; para comparaciones eficientes.&lt;/li&gt;
&lt;li&gt;Si solo necesitas ejecutar efectos una vez (como inicialización), &lt;strong&gt;siempre usa &lt;code&gt;[]&lt;/code&gt; como dependencia&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar el error de permisos al ejecutar `pip.exe` en entorno virtual (Python 3.10 en Windows)</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Thu, 25 Jun 2026 11:35:25 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-error-de-permisos-al-ejecutar-pipexe-en-entorno-virtual-python-310-en-4jjg</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-error-de-permisos-al-ejecutar-pipexe-en-entorno-virtual-python-310-en-4jjg</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el error de permisos al ejecutar &lt;code&gt;pip.exe&lt;/code&gt; en entorno virtual (Python 3.10 en Windows)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Explicación técnica
&lt;/h2&gt;

&lt;p&gt;El problema ocurre porque el archivo &lt;code&gt;pip.exe&lt;/code&gt; en &lt;code&gt;venv/Scripts/&lt;/code&gt; es un &lt;em&gt;launcher empaquetado&lt;/em&gt; que contiene una ruta fija a &lt;code&gt;python.exe&lt;/code&gt; y un script &lt;code&gt;__main__.py&lt;/code&gt; incrustado. Cuando se crea el entorno virtual, este launcher se construye con la ruta exacta del &lt;code&gt;python.exe&lt;/code&gt; que se usó para crearlo.&lt;/p&gt;

&lt;p&gt;Si esa ruta se vuelve inválida (por ejemplo, porque se desinstaló Python, se movió el entorno, o hubo una instalación incorrecta), el launcher falla con &lt;strong&gt;"Access is denied"&lt;/strong&gt;, aunque los permisos del archivo sean correctos. Esto es especialmente común tras múltiples instalaciones/desinstalaciones de Python (desde el sitio web y Microsoft Store), ya que los rutas absolutas quedan corruptas o apuntan a archivos inexistentes.&lt;/p&gt;

&lt;p&gt;El hecho de que &lt;code&gt;python -m pip&lt;/code&gt; funcione confirma que el problema está específicamente en el &lt;em&gt;launcher&lt;/em&gt;, no en los permisos del sistema ni en la configuración de seguridad.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pasos para solucionarlo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Elimina el entorno virtual actual
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Desde la raíz del proyecto&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; venv/
&lt;span class="c"&gt;# O en Windows CMD:&lt;/span&gt;
&lt;span class="nb"&gt;rmdir&lt;/span&gt; /s /q venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Crea un nuevo entorno virtual usando la versión exacta de Python que necesitas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Asegúrate de que la versión deseada esté en PATH (verifica con `python --version`)&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Importante&lt;/strong&gt;: Usa &lt;code&gt;python -m venv&lt;/code&gt;, &lt;strong&gt;no&lt;/strong&gt; &lt;code&gt;py -3.10 -m venv&lt;/code&gt; ni herramientas externas como &lt;code&gt;virtualenv&lt;/code&gt;. Esto garantiza que el launcher se construya con la ruta correcta al &lt;code&gt;python.exe&lt;/code&gt; del entorno.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Verifica que &lt;code&gt;pip.exe&lt;/code&gt; funcione correctamente
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"C:\ruta\al\proyecto\venv\Scripts\pip.exe" --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Debería mostrar algo como: &lt;code&gt;pip 23.x.x from C:\...\venv\lib\site-packages\pip (python 3.10)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. Usa siempre &lt;code&gt;python -m pip&lt;/code&gt; como práctica segura
&lt;/h3&gt;

&lt;p&gt;Aunque el launcher funcione, evita problemas futuros usando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\p&lt;/span&gt;ython.exe &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o tras activar el entorno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bloque de código corregido
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Script de diagnóstico (opcional, para verificar el launcher)
&lt;/h3&gt;

&lt;p&gt;Crea &lt;code&gt;check_pip_launcher.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rfind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;PK&lt;/span&gt;&lt;span class="se"&gt;\x05\x06&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;i0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rfind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;i1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Embedded python.exe path: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error reading launcher: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejecuta desde CMD (sin activar el entorno):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python check_pip_launcher.py "C:\ruta\al\proyecto\venv\Scripts\pip.exe"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;✅ Salida esperada: &lt;code&gt;Embedded python.exe path: C:\Users\...\venv\Scripts\python.exe&lt;/code&gt;&lt;br&gt;&lt;br&gt;
❌ Si muestra una ruta a un archivo inexistente (ej. &lt;code&gt;C:\Python39\python.exe&lt;/code&gt;), el launcher está corrupto.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Pro-tip
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nunca muevas ni copies el entorno virtual&lt;/strong&gt;. Si necesitas reutilizarlo, recrea el entorno desde cero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evita usar &lt;code&gt;pip.exe&lt;/code&gt; directamente&lt;/strong&gt;. Usa siempre &lt;code&gt;python -m pip&lt;/code&gt; en entornos virtuales: es más robusto y evita problemas con launchers corruptos.&lt;/li&gt;
&lt;li&gt;Si usas múltiples versiones de Python, instálalas desde el &lt;a href="https://www.python.org/downloads/" rel="noopener noreferrer"&gt;Python.org installer&lt;/a&gt; (no Microsoft Store) y marca la opción &lt;em&gt;"Add Python to PATH"&lt;/em&gt; durante la instalación.&lt;/li&gt;
&lt;li&gt;Para entornos productivos, considera usar &lt;code&gt;py -3.10 -m venv venv&lt;/code&gt; para forzar la versión exacta.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🔑 &lt;strong&gt;Clave final&lt;/strong&gt;: El error no es de permisos del sistema, sino de &lt;em&gt;rutas rotas en el launcher&lt;/em&gt;. La solución definitiva es recrear el entorno con &lt;code&gt;python -m venv&lt;/code&gt; y evitar manipular archivos del entorno manualmente.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cli</category>
      <category>python</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar el bucle infinito en `useEffect` con objetos y arrays</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Wed, 24 Jun 2026 11:40:57 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-bucle-infinito-en-useeffect-con-objetos-y-arrays-3h90</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-bucle-infinito-en-useeffect-con-objetos-y-arrays-3h90</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el bucle infinito en &lt;code&gt;useEffect&lt;/code&gt; con objetos y arrays
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Explicación técnica
&lt;/h2&gt;

&lt;p&gt;El problema ocurre porque &lt;code&gt;useEffect&lt;/code&gt; compara las dependencias usando &lt;strong&gt;comparación estricta (&lt;code&gt;===&lt;/code&gt;)&lt;/strong&gt;, no por contenido. Cuando usas &lt;code&gt;useState({})&lt;/code&gt;, cada llamada a &lt;code&gt;setObj({})&lt;/code&gt; crea un &lt;strong&gt;nuevo objeto en memoria&lt;/strong&gt;, aunque tenga el mismo contenido. React detecta que &lt;code&gt;obj !== obj&lt;/code&gt; (referencias diferentes), por lo que ejecuta el efecto infinitamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setObj&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setObj&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt; &lt;span class="c1"&gt;// ← ¡Nuevo objeto en memoria!&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// ← Referencia diferente → bucle infinito&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solución definitiva (3 enfoques)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Evitar la actualización innecesaria&lt;/strong&gt; (Recomendado)
&lt;/h3&gt;

&lt;p&gt;Si no necesitas actualizar el estado, &lt;strong&gt;no llames al setter&lt;/strong&gt; dentro del &lt;code&gt;useEffect&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Solo ejecutar lógica si es necesario&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Hacer algo solo si está vacío, pero NO setear de nuevo&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Comparación profunda manual&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Usa &lt;code&gt;JSON.stringify&lt;/code&gt; para comparar contenido (solo para objetos simples):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ &lt;strong&gt;Advertencia&lt;/strong&gt;: No usar en objetos grandes o con funciones/métodos.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Estado inmutable con clonación controlada&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Si necesitas resetear el estado, usa una bandera o lógica condicional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;shouldReset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setShouldReset&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shouldReset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
    &lt;span class="nf"&gt;setShouldReset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Resetear bandera&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;shouldReset&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bloque de código corregido
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Antes (bucle infinito):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt; &lt;span class="c1"&gt;// ← ¡Causa bucle infinito!&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Después (solución limpia):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIngredients&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Solo ejecutar si hay lógica real que necesite ejecutarse&lt;/span&gt;
  &lt;span class="c1"&gt;// Si solo quieres resetear, hazlo desde un evento o efecto controlado&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt; &lt;span class="c1"&gt;// ← Dependencia vacía si solo necesitas ejecutar al montar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pro-tip: Patrón de diseño recomendado
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nunca actualices el mismo estado que estás observando en el &lt;code&gt;useEffect&lt;/code&gt; sin una condición clara de salida.&lt;/strong&gt; En su lugar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Usa &lt;code&gt;useRef&lt;/code&gt; para rastrear si es la primera ejecución&lt;/li&gt;
&lt;li&gt;Implementa lógica condional con &lt;code&gt;useMemo&lt;/code&gt; para cálculos derivados&lt;/li&gt;
&lt;li&gt;Para listas/arrays, usa &lt;code&gt;useCallback&lt;/code&gt; con &lt;code&gt;useMemo&lt;/code&gt; para evitar re-renders innecesarios
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;

&lt;span class="c1"&gt;// Ejemplo: Solo actualizar si hay cambios reales&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prevDataRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevDataRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Lógica solo si cambió&lt;/span&gt;
    &lt;span class="nx"&gt;prevDataRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
      <category>react</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar `docker run` con exit code 1 en Raspberry Pi</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Tue, 23 Jun 2026 11:55:18 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exit-code-1-en-raspberry-pi-28a0</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exit-code-1-en-raspberry-pi-28a0</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar &lt;code&gt;docker run&lt;/code&gt; con exit code 1 en Raspberry Pi
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ¿Por qué ocurre?
&lt;/h2&gt;

&lt;p&gt;El error &lt;code&gt;Exited (1)&lt;/code&gt; indica que el proceso principal del contenedor terminó con un código de error no cero. En tu caso específico, &lt;strong&gt;el problema está en el comando &lt;code&gt;--net = host&lt;/code&gt;&lt;/strong&gt;. El espacio antes y después del signo &lt;code&gt;=&lt;/code&gt; es inválido en la línea de comandos de Docker. Docker interpreta &lt;code&gt;--net&lt;/code&gt; como una opción sin valor, y luego &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;host&lt;/code&gt;, &lt;code&gt;-d&lt;/code&gt;, &lt;code&gt;-t&lt;/code&gt; se convierten en argumentos para el comando del contenedor (no para Docker), lo que provoca que el contenedor falle al iniciar.&lt;/p&gt;

&lt;p&gt;Esto explica por qué funciona en la VM (quizás con Docker más permisivo o versión diferente) pero falla en el Raspberry Pi físico: diferentes versiones de Docker manejan errores de parsing con distinta severidad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pasos para solucionarlo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Corrige el formato del parámetro &lt;code&gt;--net&lt;/code&gt;&lt;/strong&gt;: elimina los espacios alrededor del &lt;code&gt;=&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifica el comando base&lt;/strong&gt;: asegúrate de que tu imagen &lt;code&gt;myimage&lt;/code&gt; tenga un proceso principal válido (un &lt;code&gt;CMD&lt;/code&gt; o &lt;code&gt;ENTRYPOINT&lt;/code&gt; funcional)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ejecuta en primer plano para depurar&lt;/strong&gt;: usa &lt;code&gt;docker run&lt;/code&gt; sin &lt;code&gt;-d&lt;/code&gt; para ver los logs en tiempo real&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Comando corregido
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Importante&lt;/strong&gt;: Si tu imagen no tiene un proceso que se mantenga en primer plano (como un servidor web o un script con &lt;code&gt;tail -f&lt;/code&gt;), el contenedor terminará inmediatamente. Para probarlo:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-it&lt;/span&gt; myimage /bin/sh
&lt;span class="c"&gt;# o&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-it&lt;/span&gt; myimage /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bloque de código corregido (versión robusta)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verifica primero el contenido de la imagen&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host myimage /bin/sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"echo 'Container OK' &amp;amp;&amp;amp; ls -la /"&lt;/span&gt;

&lt;span class="c"&gt;# Si todo funciona, ejecuta en modo detached&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pro-tip
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;code&gt;docker logs &amp;lt;container_id&amp;gt;&lt;/code&gt; después de un fallo para ver el último output del contenedor&lt;/li&gt;
&lt;li&gt;En Raspberry Pi, asegúrate de que la imagen esté construida para la arquitectura &lt;code&gt;arm32v7&lt;/code&gt; o &lt;code&gt;arm64v8&lt;/code&gt;, no para &lt;code&gt;amd64&lt;/code&gt; (común error al usar imágenes de Docker Hub genéricas)&lt;/li&gt;
&lt;li&gt;Para evitar este tipo de errores en scripts, usa la notación sin &lt;code&gt;=&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  docker run &lt;span class="nt"&gt;--net&lt;/span&gt; host &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el problema persiste, ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect &amp;lt;container_id&amp;gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; 5 &lt;span class="s1"&gt;'"State"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;para ver el estado exacto y el código de salida.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>iot</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar el error \"Text content does not match server-rendered HTML\" en Next.js App Router</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Mon, 22 Jun 2026 14:31:09 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-el-error-text-content-does-not-match-server-rendered-html-en-nextjs-app-router-1b99</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-el-error-text-content-does-not-match-server-rendered-html-en-nextjs-app-router-1b99</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar el error "Text content does not match server-rendered HTML" en Next.js App Router
&lt;/h1&gt;

&lt;p&gt;Este error ocurre cuando el HTML generado en el servidor (SSR/SSG) no coincide con el árbol de React generado durante la primera renderización en el navegador. Es un problema crítico de &lt;strong&gt;hydration mismatch&lt;/strong&gt;, y si no se soluciona, puede causar comportamientos erráticos, pérdida de accesibilidad y problemas de rendimiento.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Causa raíz (diagnóstico técnico)
&lt;/h2&gt;

&lt;p&gt;El error &lt;strong&gt;no es solo una advertencia&lt;/strong&gt;. Ocurre cuando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se renderiza contenido &lt;strong&gt;diferente en el servidor vs. cliente&lt;/strong&gt; (ej. usando &lt;code&gt;Date.now()&lt;/code&gt;, &lt;code&gt;localStorage&lt;/code&gt;, &lt;code&gt;window.innerWidth&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;Se usa lógica condicional basada en &lt;code&gt;typeof window !== 'undefined'&lt;/code&gt; &lt;strong&gt;dentro del render&lt;/strong&gt; (sin protegerlo con &lt;code&gt;useEffect&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;iOS Safari inyecta automáticamente enlaces en números de teléfono/email (&lt;code&gt;&amp;lt;a href="tel:..."&amp;gt;&lt;/code&gt;) sin que React lo espere.&lt;/li&gt;
&lt;li&gt;Librerías CSS-in-JS (como &lt;code&gt;styled-components&lt;/code&gt;) inyectan estilos dinámicos en el cliente que alteran el DOM.&lt;/li&gt;
&lt;li&gt;Herramientas de Edge/CDN (Cloudflare Auto Minify, Fastly, etc.) modifican el HTML prerrendereado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Importante&lt;/strong&gt;: React espera que el DOM inicial del cliente coincida &lt;em&gt;exactamente&lt;/em&gt; con el HTML prerrendereado. Cualquier diferencia (espacios, nodos, atributos) dispara este error.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Solución definitiva (pasos verificados)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Paso 1: Aisla el componente problemático
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Busca en consola el stack trace del error (ej. &lt;code&gt;Hydration failed because the server rendered HTML didn't match the client&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Identifica el componente y la línea exacta donde ocurre.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;console.log('server?', typeof window === 'undefined')&lt;/code&gt; en el componente sospechoso para confirmar si hay lógica condicional.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Paso 2: Aplica la solución según el caso
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🛠️ Caso A: Contenido dinámico (fechas, localStorage, APIs del navegador)
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Usa &lt;code&gt;useEffect&lt;/code&gt; para retrasar la renderización del contenido sensible:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ CORRECTO: Renderiza placeholder en SSR, luego actualiza en cliente&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Timestamp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTimestamp&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTimestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toLocaleString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;time&lt;/span&gt; &lt;span class="na"&gt;suppressHydrationWarning&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;time&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;code&gt;suppressHydrationWarning&lt;/code&gt; es seguro aquí porque el contenido es &lt;em&gt;intencionalmente diferente&lt;/em&gt; y no afecta la estructura del DOM.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  🛠️ Caso B: Uso de &lt;code&gt;window&lt;/code&gt;, &lt;code&gt;localStorage&lt;/code&gt;, &lt;code&gt;navigator&lt;/code&gt;, etc.
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Envuelve el acceso en &lt;code&gt;useEffect&lt;/code&gt; o usa &lt;code&gt;dynamic({ ssr: false })&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Opción 1: Con dynamic (recomendado para componentes completos)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dynamic&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/dynamic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ClientOnlyComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../components/ClientOnlyComponent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ssr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ClientOnlyComponent&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Opción 2: Con `useEffect` + estado (para lógica parcial)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ThemeSwitcher&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTheme&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stored&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;theme&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stored&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;setTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stored&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🛠️ Caso C: iOS inyecta enlaces en números/tiempos
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Agrega la meta etiqueta en &lt;code&gt;app/layout.tsx&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/layout.tsx&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RootLayout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"es"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"format-detection"&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"telephone=no, date=no, email=no, address=no"&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🛠️ Caso D: Librerías CSS-in-JS (styled-components, emotion)
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Asegura que el hash de estilos sea idéntico en SSR y CSR:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verifica que uses la versión compatible con Next.js App Router&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @emotion/react@latest @emotion/styled@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y en &lt;code&gt;app/layout.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/layout.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;EmotionJsxStyle&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/document&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RootLayout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;EmotionJsxStyle&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Si usas &lt;code&gt;styled-components&lt;/code&gt;, asegúrate de usar &lt;code&gt;createEmotionServer&lt;/code&gt; y &lt;code&gt;createEmotionInstance&lt;/code&gt; en &lt;code&gt;app/layout.tsx&lt;/code&gt; (ver &lt;a href="https://github.com/vercel/next.js/tree/canary/packages/next/examples/with-styled-components" rel="noopener noreferrer"&gt;guía oficial&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔧 Pro-tips para evitar regresiones
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Herramientas de detección temprana:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;code&gt;next dev --turbo&lt;/code&gt; para activar el modo estricto de hydration.&lt;/li&gt;
&lt;li&gt;Agrega este script en desarrollo para detectar mismatches silenciosos:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt; &lt;span class="c1"&gt;// utils/hydration-debug.ts&lt;/span&gt;
 &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;undefined&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;originalWarn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;?.(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hydration&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;⚠️ HYDRATION MISMATCH DETECTED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
     &lt;span class="nf"&gt;originalWarn&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;};&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Valida tu HTML prerrendereado:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abre &lt;code&gt;view-source:https://tu-sitio.com/ruta&lt;/code&gt; y compáralo con el DOM del navegador (F12 &amp;gt; Elements).&lt;/li&gt;
&lt;li&gt;Busca diferencias en:

&lt;ul&gt;
&lt;li&gt;Espacios en blanco (&lt;code&gt;&amp;amp;nbsp;&lt;/code&gt; vs &lt;code&gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Atributos &lt;code&gt;data-reactroot&lt;/code&gt;, &lt;code&gt;data-hydrate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nodos &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; inyectados por extensiones (desactiva todas en modo incógnito).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evita &lt;code&gt;suppressHydrationWarning&lt;/code&gt; como primera solución:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solo úsalo en elementos &lt;em&gt;de solo lectura&lt;/em&gt; (fechas, IDs temporales).&lt;/li&gt;
&lt;li&gt;Nunca en elementos interactivos (&lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📌 Checklist final
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅&lt;/th&gt;
&lt;th&gt;Acción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;Eliminar &lt;code&gt;typeof window !== 'undefined'&lt;/code&gt; del render directo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;Migrar lógica de &lt;code&gt;window/localStorage&lt;/code&gt; a &lt;code&gt;useEffect&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;Agregar &lt;code&gt;&amp;lt;meta name="format-detection" ...&amp;gt;&lt;/code&gt; si usas números/tiempos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;Verificar que tu CDN no modifique el HTML (Cloudflare: desactiva &lt;em&gt;Auto Minify&lt;/em&gt; y &lt;em&gt;Rocket Loader&lt;/em&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;Validar que no haya elementos anidados inválidos (&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; dentro de &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; dentro de &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🔥 &lt;strong&gt;Último recurso&lt;/strong&gt;: Si el error persiste, ejecuta &lt;code&gt;rm -rf .next &amp;amp;&amp;amp; npm run dev&lt;/code&gt;. A veces el cache de Next.js oculta mismatches persistentes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Con esto, el error desaparecerá de forma definitiva. No hay atajos: la clave es &lt;strong&gt;garantizar identidad total entre SSR y CSR&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cómo solucionar `docker run` con `Exited (1)` en Raspberry Pi</title>
      <dc:creator>Erick Eduardo Ramos</dc:creator>
      <pubDate>Sun, 21 Jun 2026 11:40:53 +0000</pubDate>
      <link>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exited-1-en-raspberry-pi-15kp</link>
      <guid>https://dev.to/erickeduardoramos03/como-solucionar-docker-run-con-exited-1-en-raspberry-pi-15kp</guid>
      <description>&lt;h1&gt;
  
  
  Cómo solucionar &lt;code&gt;docker run&lt;/code&gt; con &lt;code&gt;Exited (1)&lt;/code&gt; en Raspberry Pi
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Explicación técnica
&lt;/h2&gt;

&lt;p&gt;El error &lt;code&gt;Exited (1)&lt;/code&gt; indica que el proceso principal del contenedor terminó con un código de salida distinto de cero, lo que significa un fallo. En Raspberry Pi, este problema es &lt;strong&gt;muy frecuente&lt;/strong&gt; y tiene causas específicas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Arquitectura incompatible&lt;/strong&gt;: La imagen &lt;code&gt;myimage&lt;/code&gt; fue construida para &lt;code&gt;amd64&lt;/code&gt; (x86_64), pero Raspberry Pi usa &lt;code&gt;arm32v7&lt;/code&gt; o &lt;code&gt;arm64v8&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falta de binarios estáticos o dependencias faltantes&lt;/strong&gt;: Algunas imágenes no incluyen todas las librerías necesarias para ARM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problemas con &lt;code&gt;--net=host&lt;/code&gt; en sistemas con systemd-resolved&lt;/strong&gt;: En Raspbian, el puerto 53 está ocupado por &lt;code&gt;systemd-resolved&lt;/code&gt;, causando fallos en contenedores que intentan usarlo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falta de flags requeridos para ARM&lt;/strong&gt;: Algunos contenedores requieren flags adicionales como &lt;code&gt;--privileged&lt;/code&gt; o &lt;code&gt;--cap-add=SYS_PTRACE&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Pasos para diagnosticar y solucionar
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Paso 1: Verifica la arquitectura del host y la imagen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verifica arquitectura del Raspberry Pi&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;

&lt;span class="c"&gt;# Verifica arquitectura de la imagen&lt;/span&gt;
docker inspect myimage &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{.Architecture}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si la imagen muestra &lt;code&gt;amd64&lt;/code&gt; y tu Raspberry Pi es &lt;code&gt;armv7l&lt;/code&gt; o &lt;code&gt;aarch64&lt;/code&gt;, &lt;strong&gt;ese es el problema&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 2: Ejecuta en primer plano para ver el error real
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-t&lt;/span&gt; myimage
&lt;span class="c"&gt;# NOTA: Quita -d para ver logs en tiempo real&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Paso 3: Soluciones según el caso
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🔧 Caso A: Arquitectura incompatible (90% de los casos en Raspberry Pi)
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Solución definitiva&lt;/strong&gt;: Usa imágenes nativas para ARM o reconstruye la imagen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Opción 1: Usa imágenes oficiales con soporte multi-arch&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; arm32v7/nginx:latest
&lt;span class="c"&gt;# o para Raspberry Pi 4/400 (64-bit)&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; arm64v8/nginx:latest

&lt;span class="c"&gt;# Opción 2: Construye la imagen con QEMU para emulación (si no tienes alternativa)&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--privileged&lt;/span&gt; multiarch/qemu-user-static &lt;span class="nt"&gt;--reset&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nb"&gt;yes
&lt;/span&gt;docker buildx create &lt;span class="nt"&gt;--use&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; mybuilder
docker buildx build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm/v7 &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:armv7 &lt;span class="nt"&gt;--load&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🔧 Caso B: Fallo por &lt;code&gt;--net=host&lt;/code&gt; en Raspbian
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Detén systemd-resolved temporalmente&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop systemd-resolved

&lt;span class="c"&gt;# O usa bridge networking en su lugar&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;bridge &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 &lt;span class="nt"&gt;-d&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🔧 Caso C: Falta de permisos o dependencias
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Agrega flags comunes para Raspberry Pi&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;--privileged&lt;/span&gt; &lt;span class="nt"&gt;--cap-add&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;SYS_PTRACE &lt;span class="nt"&gt;-d&lt;/span&gt; myimage

&lt;span class="c"&gt;# O si usas Docker Compose:&lt;/span&gt;
version: &lt;span class="s1"&gt;'3'&lt;/span&gt;
services:
  app:
    image: myimage
    network_mode: &lt;span class="s2"&gt;"host"&lt;/span&gt;
    privileged: &lt;span class="nb"&gt;true
    &lt;/span&gt;cap_add:
      - SYS_PTRACE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bloque de código corregido (ejemplo funcional)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Verifica arquitectura&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;  &lt;span class="c"&gt;# Debe coincidir con la arquitectura de la imagen&lt;/span&gt;

&lt;span class="c"&gt;# 2. Si es incompatible, usa una imagen ARM&lt;/span&gt;
docker pull arm32v7/alpine:latest
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; arm32v7/alpine sh

&lt;span class="c"&gt;# 3. Para tu imagen personalizada (reconstruida para ARM):&lt;/span&gt;
docker buildx build &lt;span class="nt"&gt;--platform&lt;/span&gt; linux/arm/v7 &lt;span class="nt"&gt;-t&lt;/span&gt; myimage:armv7 &lt;span class="nt"&gt;--load&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-d&lt;/span&gt; myimage:armv7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pro-tip
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Siempre usa &lt;code&gt;docker logs &amp;lt;container_id&amp;gt;&lt;/code&gt;&lt;/strong&gt; después de un &lt;code&gt;Exited (1)&lt;/code&gt; para ver el mensaje de error real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;En Raspberry Pi 4 con Raspberry Pi OS 64-bit&lt;/strong&gt;, usa imágenes &lt;code&gt;arm64v8&lt;/code&gt; en lugar de &lt;code&gt;arm32v7&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Para desarrollo rápido&lt;/strong&gt;, añade &lt;code&gt;-it&lt;/code&gt; en lugar de &lt;code&gt;-d&lt;/code&gt; para ver errores en tiempo real:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  docker run &lt;span class="nt"&gt;--net&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="nt"&gt;-it&lt;/span&gt; myimage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Verifica espacio en disco&lt;/strong&gt;: &lt;code&gt;df -h /var/lib/docker&lt;/code&gt; — Raspberry Pi suele tener poco espacio y Docker falla silenciosamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Nota crítica&lt;/strong&gt;: El error &lt;code&gt;Exited (1)&lt;/code&gt; &lt;strong&gt;nunca&lt;/strong&gt; es un bug de Docker. Siempre es un problema en la aplicación o entorno del contenedor. El código de salida 1 es genérico: el verdadero diagnóstico está en los logs.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>docker</category>
      <category>iot</category>
      <category>spanish</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
