Saltar al contenido

docker-compose volumen en node_modules pero está vacío

Bienvenido a nuestra web, ahora hallarás la solucíon a lo que necesitas.

Solución:

Primero, hay un orden de operaciones. Cuando crea su imagen, los volúmenes no se montan, solo se montan cuando ejecuta el contenedor. Entonces, cuando haya terminado con la compilación, todos los cambios solo existirán dentro de la imagen, no en ningún volumen. Si monta un volumen en un directorio, superpone lo que sea de la imagen en esa ubicación, ocultando esos contenidos de la vista (con una excepción de inicialización, ver más abajo).


Lo siguiente es la sintaxis del volumen:

  volumes:
    - .:/usr/src/app
    - /usr/src/app/node_modules

le dice a docker-compose que cree un volumen de host desde el directorio actual para /usr/src/app dentro del contenedor, y luego mapear /usr/src/app/node_modules a un volumen anónimo mantenido por Docker. Este último aparecerá como un volumen en docker volume ls con un largo uuid string eso es relativamente inútil.

Para asignar /usr/src/app/node_modules a una carpeta en su host, deberá incluir un nombre de carpeta y dos puntos delante de eso, como lo hizo en la línea anterior. P.ej /host/dir/node_modules:/usr/src/app/node_modules.

Los volúmenes con nombre son un poco diferentes a los volúmenes de host en que la ventana acoplable los mantiene con un nombre que puede ver en docker volume ls. Hace referencia a estos volúmenes con solo un nombre en lugar de una ruta. Entonces node_modules:/usr/src/app/node_modules crearía un volumen llamado node_modules que puede montar en un contenedor con ese nombre.

Me desvié para describir los volúmenes con nombre porque vienen con una función que se convierte en un problema con los volúmenes de host. Docker lo ayuda con los volúmenes con nombre inicializándolos con el contenido de la imagen en esa ubicación. Entonces, en el ejemplo anterior, si el volumen nombrado node_modules está vacío (o nuevo), primero copiará el contenido de la imagen en / usr / src / app / node_modules` en este volumen y luego lo montará dentro de su contenedor.

Con los volúmenes de host, nunca verá ninguna inicialización, lo que sea que esté en esa ubicación, incluso un directorio vacío, es todo lo que ve en el contenedor. No hay forma de obtener el contenido de la imagen en esa ubicación del directorio para copiarlo primero al volumen del host en esa ubicación. Esto también significa que los permisos de directorio necesarios dentro del contenedor no se heredan automáticamente, debe configurar manualmente los permisos en el directorio de host que funcionará dentro del contenedor.


Finalmente, hay un pequeño problema con la ventana acoplable para Windows y Mac, se ejecutan dentro de una VM y los volúmenes de host se montan en la VM. Para montar el volumen en el host, debe configurar la aplicación para compartir la carpeta en su host con la VM y luego montar el volumen en la VM en el contenedor. De forma predeterminada, en Mac, se incluye la carpeta / Users, pero si usa otros directorios, por ejemplo, un directorio / Projects, o incluso una minúscula / users (unix y bsd distinguen entre mayúsculas y minúsculas), no verá el contenido de tu Mac dentro del contenedor.


Con ese conocimiento básico cubierto, una posible solución es rediseñar su flujo de trabajo para obtener el contenido del directorio de la imagen copiada en el host. Primero necesitas copiar los archivos a una ubicación diferente dentro de tu imagen. Luego, debe copiar los archivos desde la ubicación de la imagen guardada en la ubicación de montaje del volumen al iniciar el contenedor. Cuando hace lo último, debe tener en cuenta que está frustrando el propósito de tener un volumen (persistencia) y es posible que desee considerar agregar algo de lógica para ser más selectivo al ejecutar la copia. Para comenzar, agregue un entrypoint.sh a su compilación que se vea así:

#!/bin/sh
# copy from the image backup location to the volume mount
cp -a /usr/src/app_backup/node_modules/* /usr/src/app/node_modules/
# this next line runs the docker command
exec "[email protected]"

Luego actualice su Dockerfile para incluir el punto de entrada y un comando de respaldo:

FROM node:6.3

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install -g babel babel-runtime babel-register mocha nodemon
RUN npm install

# Bundle app source
COPY . /usr/src/app
RUN cp -a /usr/src/app/. /usr/src/app_backup

EXPOSE 1234
ENTRYPOINT [ "/usr/src/app/entrypoint.sh" ]
CMD [ "npm", "start" ]

Y luego suelte el volumen adicional de su docker-compose.yml:

  volumes:
    - .:/usr/src/app

TL; DR Ejemplo de trabajo, clone e intente: https://github.com/xbx/base-server


Primero necesita un node_modules en su computadora (imagen exterior) para fines de depuración (antes de ejecutar el contenedor).

Si desea depurar solo node_modules:

volumes:
    - /path/to/node_modules:/usr/src/app/node_modules

Si desea depurar tanto su código como los módulos node_modules:

volumes:
    - .:/usr/src/app/

Recuerda que necesitarás correr npm install al menos una vez fuera del contenedor (o copie el directorio node_modules que el docker build genera). Déjame ahora si necesitas más detalles.


Editar. Entonces, sin la necesidad de npm en OSX, puede:

  1. docker build y luego docker cp :/path/to/node-modules ./local-node-modules/. Luego, en su docker-compose.yml, monte esos archivos y solucione los problemas que desee.
  2. O, docker build y allí (Dockerfile) hacen el npm install en otro directorio. Luego, en su comando (CMD o comando docker-compose) haga la copia (cp) al directorio correcto, pero este directorio se monta vacío desde su computadora (un volumen en el docker-compose.yml) y luego soluciona los problemas que desee.

Editar 2. (Opción 2) Ejemplo de trabajo, clone e intente: https://github.com/xbx/base-server Lo hice todo automáticamente en este repositorio bifurcado del tuyo.

Dockerfile

FROM node:6.3

# Install app dependencies
RUN mkdir /build-dir
WORKDIR /build-dir
COPY package.json /build-dir
RUN npm install -g babel babel-runtime babel-register mocha nodemon
RUN npm install

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
RUN ln -s /build-dir/node_modules node_modules

# Bundle app source
COPY . /usr/src/app

EXPOSE 1234
CMD [ "npm", "start" ]

docker-compose.yml

web:
  build: .
  ports:
    - "1234:1234"
  links:
    - db # liaison avec la DB
  environment:
    PORT: 1234
  command: /command.sh
  volumes:
    - ./src/:/usr/src/app/src/
    - ./node_modules:/usr/src/app/node_modules
    - ./command.sh:/command.sh
db:
  image: mongo:3.3
  ports:
    - "27017:27017"
  command: "--smallfiles --logpath=/dev/null"

command.sh

#!/bin/bash

cp -r /build-dir/node_modules/ /usr/src/app/

exec npm start

Por favor, clona mi repositorio y haz docker-compose up. Hace lo que quiere. PD: se puede mejorar para hacer lo mismo de una mejor manera (es decir, mejores prácticas, etc.)

Estoy en OSX y me funciona.

Comentarios y puntuaciones

Agradecemos que quieras asistir nuestra faena añadiendo un comentario o dejando una puntuación te lo agradecemos.

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



Utiliza Nuestro Buscador

Deja una respuesta

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