Search code examples
dockerdocker-composedocker-volume

Docker Compose Relative paths vs Docker volume


I have a docker compose file for a website, which amongst a bunch of other containers for various purposes, includes a mysql database that will have persistent data. At the moment the compose file specifies a relative path for the data, e.g.:

 
mysql: 
  image: mysql:5.7
  container_name: sqldb
  volumes:
   - ./mysql_data/_data:/var/lib/mysql

and the folder structure:

 --mysql_data
 --static_content
 docker-compose.yml

which means that at any point I can move the whole site (including persisted content) to another server by copying the whole folder and running docker-compose up.

But reading about docker volumes it sounds like it is the preferred method (plus relative bind mount paths don't seem to be supported using "docker run", but work in compose) so I'm wondering if I need to change this approach to use volumes? Is there something inherently wrong with this relative binding approach? If I do switch to volumes, when moving the containers do I have to manually move the volumes (e.g. this method How to port data-only volumes from one host to another?)?


Solution

  • Persistence of data in Docker

    There are four possible options to mount any volume:

    1. Relative Path
    2. Absolute Path
    3. Docker Volume Default Path
    4. Docker Volume with Absolute Path

    Here is the example for above:

    version: '3'
    services:
        sample:
            image: sample
            volumes:
                - ./relative-path-volume:/var/data-two
                - /home/ubuntu/absolute-path-volume:/var/data-one
                - docker-volume-default-path-volume:/var/data-three
                - docker-volume-absolute-path-volume:/var/data-four
    volumes:
      docker-volume-default-path-volume: {}
      docker-volume-absolute-path-volume:
        driver: local
        driver_opts:
          o: bind
          type: none
          device: /home/path/of/your/folder
    

    Relative Path: ./relative-path-volume:/var/data-two

    Absolute Path: /home/ubuntu/absolute-path-volume:/var/data-one

    Docker Volume Default Path: docker-volume-default-path-volume:/var/data-three

    Docker Volume with Absolute Path: docker-volume-absolute-path-volume:/var/data-four

    This works for any server as we customize the volume device property to the respective directory path.