He creado una compilación de varias etapas.

  • Etapa 1: use el nodo: 16.10-alpine para compilar fuentes
  • Etapa 2: use una imagen alpine nginx, copie la carpeta de compilación de la primera etapa, mueva la configuración, exponga el puerto, agregue el punto de entrada.

Aquí está el Dockerfile:

# Builder
FROM node:10.16-alpine AS builder

... # Do stuff

# Release
FROM nginx:1.16.0-alpine

COPY --from=builder /usr/src/app/build /usr/share/nginx/html

... # Do stuff

ENTRYPOINT [ ... ]

Bastante sencillo, diría yo. Sé que si ejecuta docker build -t website:latest . creará una imagen intermedia <none>, que es la imagen del constructor, que podría usarse más adelante, si no hubiera cambios en las fuentes o package.json.

Entonces, pensé en etiquetar el paso builder algo como esto: docker build --target builder -t website-builder . y para que incluso si las fuentes cambian, solo usará la misma etiqueta y no (corríjame si me equivoco ) crear otras imágenes.

Si ejecuto la compilación con la marca --target primero y ejecuto la compilación nuevamente sin ella, no uso el constructor.

Para resumir:

  1. docker build --target builder -t website-builder . Primer paso
  2. docker build -t website:latest . Segundo paso

Se creó una nueva imagen <none> que es la misma que website-builder.

¿Cómo puedo lograr que la imagen del constructor se use en la etapa de 'Lanzamiento' y se vuelva a escribir, si se cambia? Si eso no se puede hacer, ¿cuál es la mejor práctica en este caso? Hay uno?

Gracias por seguir adelante. Agradezco cualquier comentario o consejo.

1
Filipp Sher 24 oct. 2019 a las 10:58

1 respuesta

La mejor respuesta

Creo que puedes usar:

COPY --from=website-builder:latest .....
1
LinPy 24 oct. 2019 a las 08:03