Parece que no puedo obtener la imagen de mi nodo: alpine Docker para que se construya un react/next.js.
Puedo hacer que se construya bien localmente, pero nunca veo el tráfico en mis registros de API cuando la compilación de Docker llega al punto final de la API, que se ejecuta en un contenedor Docker (nginx, headless craft cms, etc.).
A la compilación no parece gustarle localhost en absoluto, como he intentado:
http://localhost:9000/api
... y este es el mensaje que recibo en los registros:
#15 13.76 > Build error occurred #15 13.76 FetchError: request to http://localhost:9000/api failed, reason: connect ECONNREFUSED 127.0.0.1:9000
Escuché que puedo usar el nombre de host en lugar de "localhost", así que en mi terminal MacOS escribí "hostname" y cambié el localhost por este valor. Esto no genera un error absoluto, pero la compilación se bloquea en el paso "Generando páginas..." de la compilación.
¿Cómo puedo hacer que la compilación de Docker reconozca localhost o, dicho de otro modo, cómo puedo configurar la URL de mi API en un punto final alojado por un contenedor de Docker local?
Aquí está mi Dockerfile:
# Install dependencies only when needed FROM node:alpine AS deps RUN apk add --no-cache libc6-compat WORKDIR /app COPY package.json yarn.lock ./ RUN yarn --frozen-lockfile # Rebuild the source code only when needed FROM node:alpine AS builder WORKDIR /app COPY . . COPY --from=deps /app/node_modules ./node_modules RUN yarn static # Production image, copy all the files and run next FROM node:alpine AS runner WORKDIR /app ENV NODE_ENV production RUN addgroup -g 1001 -S nodejs RUN adduser -S nextjs -u 1001 # You only need to copy next.config.js if you are NOT using the default configuration COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./package.json USER nextjs EXPOSE 3000 # Next.js collects completely anonymous telemetry data about general usage. # Learn more here: https://nextjs.org/telemetry # Uncomment the following line in case you want to disable telemetry. # ENV NEXT_TELEMETRY_DISABLED 1 CMD ["yarn", "start"]
Bien, descubrí la solución, o más bien una solución.
Después de investigar, descubrí que necesitaba conectarme a la "red puente".
Descubrí cuál era la IP de la red del puente escribiendo primero "docker network ls":
Esto me dio el nombre de la red para la que necesitaba obtener la IP, lo hice escribiendo "docker network inspect craftcms_default":
Esto genera bastantes resultados en mi caso, pero lo único que necesito es la IP de "Puerta de enlace", que aquí es 172.19.0.1
Mi servidor nginx está asignado a 9000:80, por lo que la API Craft CMS sin interfaz gráfica de usuario está en:
... sin embargo, como una verificación rápida de cordura, ingresé esto en el navegador y el resultado fue una página que giraba/cargaba constantemente. Sin inmutarme, ingresé esto en env.local como PUBLIC_NEXT_API_URL y la generación del sitio estático se completó correctamente durante la compilación de Docker.
Todavía estoy experimentando con una forma elegante de configurar este env var dentro de la compilación de Docker, por lo que si alguien tiene alguna sugerencia, ¡me encantaría escucharla!
Este fue un desafío interesante considerando que no pude encontrar ninguna respuesta/resultado de Google específicamente para un proceso que se ejecuta como resultado de que una compilación de Docker no pudo obtener una URL alojada dentro de otro contenedor que se ejecuta localmente. ¡Espero que esto ayude a cualquier otra persona que tenga problemas con este problema!
Gracias por su publicación, me ayudó a llegar a una solución que debería funcionar. Descubrí que definir la puerta de enlace de la red del puente es una solución más elegante; le permite definir PUBLIC_NEXT_API_URL y nunca cambiarlo.
Así es como puede hacerlo en un archivo docker-compose:
services: db: image: postgres restart: always networks: - stagingnetwork api: image: express restart: always ports: - '3008:3008' depends_on: - db networks: - stagingnetwork adminer: image: adminer restart: always networks: - stagingnetwork ports: - 8080:8080 networks: stagingnetwork: driver: bridge ipam: config: - subnet: 172.28.0.0/16 gateway: 172.28.0.1
Ahora puede establecer PUBLIC_NEXT_API_URL to http://172.28.0.1:3008/api,
y estar seguro de que este será el punto final cada vez que inicie docker-compose.
Además, tenga en cuenta que es posible que deba eliminar una red existente y luego "docker-compose up --force-recreate"
para obtener la IP correcta.
Sé que este es un problema antiguo, pero dejaré mi solución aquí para cualquier persona nueva. Aunque la solución dada funcionó para mí, busqué algo más elegante. Aparentemente, este problema ocurre porque el nombre de host localhost
siempre se refiere al host local del contenedor actual y no al de su máquina host.
Enterrados en la ventana acoplable para documentos de mac, se refieren al uso de host.docker.internal
para conectarse desde un contenedor a otro servicio. Usar el nombre del contenedor como se recomienda en muchas otras respuestas no me ayudó, pero usar host.docker.internal
solucionó el problema.
documentos:
https://docs.docker.com/docker-for-mac/networking/
referencia:
https://forums.docker.com/t/localhost-and-docker-compose-networking-issue/23100/5