Saltar al contenido

Docker: no se pueden compartir datos entre contenedores dentro de un volumen (docker-compose 3)

Posterior a de esta extensa recopilación de información dimos con la respuesta este atasco que tienen algunos de nuestros usuarios. Te ofrecemos la respuesta y nuestro deseo es que sea de mucha apoyo.

Solución:

Dos cambios que necesitas. En su servicio de nodo agregue el volumen como:

volumes:
  - vnode:/usr/src/bundle_client

Ya que quieres compartir /usr/src/bundle_client NO deberías estar usando /usr/src/ porque eso compartirá la carpeta completa y la estructura también.

Y luego, en su servicio nginx, agregue el volumen como:

volumes:
  - type: volume
    source: vnode
    target: /var/www/test/static
    volume:
      nocopy: true

El nocopy: true mantiene clara nuestra intención de que en el mapa inicial del contenedor no se debe copiar el contenido de la carpeta mapeada. Y, de forma predeterminada, el primer contenedor que se asigna al volumen obtendrá el contenido de la carpeta asignada. En tu caso quieres que este sea el node envase.

Además, antes de realizar la prueba, asegúrese de ejecutar el siguiente comando para eliminar los volúmenes almacenados en caché:

docker-compose down -v

Puede ver durante mi prueba que el contenedor tenía los archivos:

Nginx tiene archivos

Explicación de lo que sucede paso a paso

Dockerfile.node

    ...
    COPY ./client /usr/src
    ...

docker-compose.yml

services:
  ...
  node:
    ...
    volumes:
      - ./server/nginx.conf:/etc/nginx/nginx.conf:ro
      - vnode:/usr/src
  ...
volumes:
  vnode:
  1. docker-compose up crea con esta sección Dockerfile.node y docker-compose a volumen con nombre con datos guardados en /usr/src.

Dockerfile.nginx

FROM nginx:latest

COPY ./server/nginx.conf /etc/nginx/nginx.conf

RUN mkdir -p /var/www/tg/static

EXPOSE 80
EXPOSE 443

CMD ["nginx", "-g", "daemon off;"]
  1. Eso produce que los contenedores nginx creados con docker-compose tendrá un vacío /var/www/tg/static/

docker-compose.yml

 ...
 nginx:
    build:
      context: .
      dockerfile: ./Dockerfile.nginx
    container_name: tg_nginx
    restart: always
    volumes:
      - ./server/nginx.conf:/etc/nginx/nginx.conf:ro
      - vnode:/var/www/tg/static
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - node
      - gunicorn
    networks:
      - nw_web_tg

 volumes:
   vdata:
   vnode:
  1. docker-compose up producirá eso vnode se crea un volumen con nombre y se llena con datos de /var/www/tg/static (vacío por ahora) a vnode existente.

Entonces, en este punto, el contenedor nginx tiene /var/www/tg/static vacío porque se creó vacío (ver mkdir en Dockerfile.nginx) – el contenedor del nodo tiene el directorio /usr/src con el archivo del cliente (vea que se copió en Dockerfile.node) – vnode tiene contenido de /usr/src de node y /var/www/tg/static de nginx.

En definitiva, para pasar datos de /usr/src desde tu node contenedor para /var/www/tg/static en nginx container necesita hacer algo que no es muy bonito porque Docker aún no ha desarrollado otra forma: necesita combinar volumen con nombre en la carpeta de origen con enlazar volumen en destino:

 nginx:
     build:
       context: .
       dockerfile: ./Dockerfile.nginx
     container_name: tg_nginx
     restart: always
     volumes:
       - ./server/nginx.conf:/etc/nginx/nginx.conf:ro
       - /var/lib/docker/volumes/vnode/_data:/var/www/tg/static
     ports:
       - "80:80"
       - "443:443"
     depends_on:
       - node
       - gunicorn
     networks:
       - nw_web_tg

Solo cambia en docker-compose - vnode:/var/www/tg/static por - /var/lib/docker/volumes/vnode/_data:/var/www/tg/static

Sección de Reseñas y Valoraciones

Agradecemos que quieras añadir valor a nuestra información tributando tu veteranía en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *