Estoy tratando de contener el front-end de mi sitio web y automatizar su implementación. Mi objetivo es poder generar y alojar una nueva imagen cuando se envía un cambio, y hacer que el servidor la busque automáticamente y reinicie el contenedor. Estos son los pasos que estoy tomando:
Creo la imagen creando primero mi aplicación Node y luego agrupando los archivos de configuración de distribución y nginx en la última imagen de linuxserver/letsencrypt . Este es el Dockerfile:
# Use the NodeJS image as builder FROM node:alpine AS builder # Create the workspace RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # Copy the package file and source code COPY package.json /usr/src/app COPY . ./ # Install dependencies RUN npm install # Build the application RUN npm run build # The nginx server, this builds the final image FROM linuxserver/letsencrypt # Copy the nginx configuration COPY ./config/nginx.conf /config # Copy the output of the builder COPY --from=builder /usr/src/app/dist /config/www # Inform Docker to listen on port 443 and 80 EXPOSE 443 80Esta imagen se carga en el registro de paquetes de GitHub y busco actualizaciones usando Watchtower .
La imagen se inicia con este archivo docker-compose:
version: "3" services: ... frontend: image: [IMAGE] container_name: frontend cap_add: - NET_ADMIN environment: - PUID=1000 - PGID=1000 - TZ=[TIMEZONE] - URL=[URL] - SUBDOMAINS=www, - VALIDATION=http ports: - 443:443 - 80:80 volumes: - ./frontend:/config restart: unless-stopped ... El problema es que los archivos que se empaquetaron en la imagen usando la instrucción COPY se sobrescriben cuando uso la siguiente línea en mi docker-compose:
volumes: - ./frontend:/configSi elimino esa sección de mi archivo docker-compose, todo funciona bien, sin embargo, esta no es una solución porque esa carpeta almacena datos importantes.
He leído que montar un volumen sobrescribe por completo cualquier dato anterior, sin embargo, me gusta el hecho de que puedo cargar fácilmente la imagen en mi servidor y tener todos los archivos necesarios ya integrados. ¿Hay algo que pueda hacer para solucionar mi problema o estoy malinterpretando/usando mal las imágenes de la ventana acoplable?
Intenté configurar el volumen para leer solo como se sugiere aquí , sin embargo, esto no funcionó y, en cambio, provocó que la imagen se detuviera y reiniciara continuamente.
También he leído brevemente acerca de los montajes de enlace y me pregunto si serán de alguna utilidad.
Se espera este comportamiento. Los montajes de Docker funcionan de la misma manera que los montajes de Linux, es decir, sobrescriben el contenido del directorio de destino con el contenido del directorio de origen.
Mi sugerencia es utilizar otro directorio de destino para su volumen, por ejemplo
volumes: - ./frontend:/someotherdirY luego ajuste su configuración nginx para buscar archivos JS allí.
Descubrí que podía retener los datos en la imagen creando primero un volumen con nombre :
volumes: frontend_data:Y luego montando el contenedor a ese volumen:
services: frontend: ... volumes: - frontend_data:/config ...