'Make docker-compose ignore folder within volume

I'm using docker-compose for a Rails setup. To sync the files, I've mounted the directory like (some of the code is omitted):

app:
    build: .
    command: rails server -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app

However, when running the app, I don't want the folder, tmp, to be synced. Adding the folder to dockerignore only solves the problem when building the docker image. How can I ignore the tmp folder from being synced between the host and guest when running docker compose?



Solution 1:[1]

This used to be possible as described in Add a volume to Docker, but exclude a sub-folder. The solutions offered there didn't work for me anymore with docker-compose 1.25.0-rc3, file syntax v3.

Solution 2:[2]

You can use a data volume to store tmp, as data volumes copy in the data from the built docker image before the app directory is mounted

volumes:
- .:/app
- /path/to/tmp

Solution 3:[3]

You can add a second volume to a sub-path. It will override the contents of the existing volume. Like so :

app:
    build: .
    command: rails server -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
      - ./empty-tmp:/app/tmp

This will effectively make /app/tmp show the contents of ./empty-tmp on the host system. Instead of showing the contents of ./tmp

Solution 4:[4]

What I ended up doing was to simply map all the folders which I wanted to sync:

- ./app:/app/app
- ./lib:/app/lib
- ./log:/app/log
- ./spec:/app/spec

Which seems to solve the problem

Solution 5:[5]

The right way to exclude folder from container but still be able to login into container and inspect files (I'm talking about development environment):

volumes:
  - ./app-backend:/srv/www/app
  - type: tmpfs
    target: /srv/www/app/var/

So my ./var folder is excluded from syncing but when I log into the container - cache and log files are there.

Reference: https://docs.docker.com/storage/tmpfs/, a quote:

a tmpfs mount is temporary, and only persisted in the host memory. When the container stops, the tmpfs mount is removed, and files written there won’t be persisted.

This works for:

  • Docker version 20.10.13
  • Docker Compose version v2.3.3

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 thisismydesign
Solution 2 Siyu
Solution 3 Markus Stefanko
Solution 4 Anders
Solution 5 Anton