Home > Enterprise >  Docker is not copying file on a shared volume during build
Docker is not copying file on a shared volume during build

Time:05-19

I would like to have the files created on the building phase stored on my local machine

I have this Dockerfile

FROM node:17-alpine as builder
WORKDIR '/app' 

COPY ./package.json ./   
RUN npm install
RUN npm i -g @angular/cli

COPY . .
RUN ng build foo --prod  
RUN touch test.txt #This is just for test

CMD ["ng", "serve"] #Just for let the container running

I also created a shared volume via docker compose

services:  
  client:
      build:
        dockerfile: Dockerfile.prod
        context: ./foo
      volumes:
        - /app/node_modules 
        - ./foo:/app

If I attach a shell to the running container and run touch test.txt, the file is created on my local machine. I can't understand why the files are not created on the building phase...

If I use a multi stage Dockerfile the dist folder on the container is created (just adding this to the Dockerfile), but still I can't see it on the local machine

FROM nginx
EXPOSE 80 
COPY --from=builder /app/dist/foo /usr/share/nginx/html

CodePudding user response:

I can't understand why the files are not created on the building phase...

That's because the build phase doesn't involve volume mounting.

Mounting volumes only occur when creating containers, not building images. If you map a volume to an existing file or directory, Docker "overrides" the image's path, much like a traditional linux mount. Which means, before creating the container, you image has everything from /app/* pre-packaged, and that's why you're able to copy the contents in the multistage build.

However, as you defined a volume with the - ./foo:/app config in your docker-compose file, the container won't have those files anymore, and instead the /app folder will have the current contents of your ./foo directory.

If you wish to copy the contents of the image to a mounted volume, you'll have to do it in the ENTRYPOINT, as it runs upon container instantiation, and after the volume mounting.

  • Related