Search code examples
dockerdocker-composedocker-swarm

Remote & Local Volume Paths on Docker Machine


I have three nodes with docker in swarm mode. I deploy from my machine using contexts to target remote host.

I have the following docker-compose.yml:

version: "3.9"
services:
...
  nginx:
    image: 'nginx:1.23.3-alpine'
    ports:
      - 8080:80
    volumes:
      - ./conf:/etc/nginx/conf.d
    depends_on:
      - ui
...

How can I deliver the ./conf directory to one of the docker hosts? I found an outdated and inconvenient way, but there are more recent solutions (declare directly in the docker-compose.yml)?


Solution

  • The simple answer is, you don't. Docker Compose does not support this directly.

    However, there are options that involve varying amounts of refactoring of your deployment process and they include:

    1. Create a root relative conf folder (/mnt/conf etc) on the remote server, and reference that. Deploy files via some other process (scp etc.)
    2. Create a "conf" volume remotely, and populate it using a docker image that you build that carries the files. (There is a syntax to mount a filesystem from another container, IDK if its compose compatible, but you could just mount a container that you build with the contents of ./conf You will need a registry to store the image so you can build it locally, but reference it remotely. registry:2 is easy to deploy)
    3. If "conf" contains 1 to a few files, then enable swarm mode remotely, and mount the individual files as docker configs. This means using docker -c remote stack deploy rather than docker -c remote compose up.
    4. Make "conf" shared on a nfs server, and declare the volume using docker local volume drivers option that supports nfs (or other fstab compatible) mounts. Alternative put the files in a s3 bucket (AWS or using a product like minio) and use the same syntax to use the "s3fs" fuse driver (if you don't use a containerised fuse driver, the fs driver will need to be installed on the remote host)
    5. Use an actual docker volume plugin (e.g. https://rclone.org/docker/) to mount a wide variety of network shares into a compose or swarm service.