Tengo una imagen acoplable que instala ubuntu y RUN algunos comandos adicionales, como instalar NodeJS.
El Dockerfile (en combinación con un docker-compose.yml ) también monta un directorio en un directorio en el host. Eso se ve así:
services: test: build: context: ../../ dockerfile: docker/Dev/Dockerfile ports: - 7000:7000 volumes: - ./../../src:/src En el Dockerfile tengo las siguientes líneas para un volumen:
VOLUME ["/src"] WORKDIR /src Cuando ejecuto el contenedor con docker-compose up y luego hago un ls -a dentro de la carpeta src/ montada del contenedor, veo todos los archivos que también veo en el host. Hasta aquí todo bien.
(El comando que ejecuto también mira dentro del contenedor: docker exec -it <container hash> ls -a )
Dado que todos los archivos parecen estar allí, incluido un package.json , agregué un nuevo comando Dockerfile RUN es: npm install . Así que tengo esto:
VOLUME ["/src"] WORKDIR /src RUN npm install Excepto que me da un error de que no puede encontrar un package.json en la carpeta src/ .
Cuando agrego un RUN ls -a (recuerde, cambié a la carpeta src/ con WORKDIR ), luego muestra que es un directorio vacío...
Entonces en Dockerfile tengo:
VOLUME ["/src"] WORKDIR /src # shows that /src is empty. If I do 'RUN pwd', then it shows I really am in /src RUN ls -a RUN npm install Pero aún así, después de hacer un docker-compose up y luego volver a hacer un ls -a dentro de la carpeta /src del contenedor, muestra todos mis archivos fuente nuevamente.
Entonces mi pregunta es, ¿por qué no están allí durante el tiempo de compilación (estoy ejecutando docker-compose build )?
¿Cuál es la forma de solucionar este problema?
Está malinterpretando la diferencia entre el comando VOLUME en un Dockerfile y el indicador -v en el demonio docker (lo que usa docker-compose para sus volúmenes).
Los valores debajo de la clave de volumes en su archivo docker-compose le dicen a docker qué directorios mapear después de que su imagen haya terminado de construirse. No se utilizan durante el proceso de compilación.
Afortunadamente, automáticamente tiene acceso a todos sus archivos de origen, debido a la línea de context en su archivo de composición: ¡solo están en el directorio src local, no en su directorio de trabajo actual!
Intente actualizar su Dockerfile a lo siguiente:
# NOTE: You don't want a VOLUME directive if you only want to mount a local # directory. WORKDIR is optional, but doesn't matter for my example, # so I'm omitting it. # Copy the npm files into your Docker image. If you do this first, the docker # daemon can cache the built layers, making your images build faster and be # substantially smaller, since most of your dependencies will remain unchanged # between builds. COPY src/package.json package.json COPY src/npm-shrinkwrap.json npm-shrinkwrap.json # Actually install the dependencies. RUN npm install # Copy all of your source files from the `src` directory into the Docker image. COPY src . Ahora, un problema aquí: probablemente ya tenga sus módulos npm instalados en src/node_modules . Por lo tanto, puede deshacerse de todo lo anterior, excepto la línea COPY final, o puede agregar src/node_modules a un archivo .dockerignore en su raíz de compilación ( ../.. ).