I have a docker-compose.yml file where I'm defining several services, each resulting in an individual container. In short it looks like this:
version: "3.9"
services:
dev_1:
build:
context: .
dockerfile: ./Dockerfile
target: dev_1
volumes:
- type: bind
source: /home/foo
target: /home/bar
dev_2:
build:
context: .
dockerfile: ./Dockerfile
target: dev_2
volumes:
- type: bind
source: /home/foo
target: /home/bar
You can see that for each service I have to bind mount the volume again, by copying the same lines of code. But in my application I have several such folders which I want to mount into all the services, but without having to copy all the lines again and again.
Is there a way to shorten this, e.g. by using the volumes directive?
So far I only found suggestions to use a shared volume, but this is not practical for me, as such a volume copies the data into the volume. But I have plenty of data (Terrabytes) which I don't want to copy. I just want to bind mount it.
The docker compose version doesn't matter - right now I'm using 3.9. As long as it works everything is allowed.
Thanks in advance!
I found an answer on medium, that solves my problem: using anchors, aliases and the
x-flag makes it possible to define the volumes in a central service, which can then be reused in the other services:At first, I define
x-volumes_allas the common service - the precedingx-indicates that the service is hidden and only there to be reused in other services. Additionally, I use the anchor&to give it an arbitrary name (&volumes_all). In the volumes section I simply define my bind mounts, again using anchors to give each volume a name (&vol1and&vol2).Later, in my service section I import the hidden service (
<<: *volumes_all) by dereferencing the alias using*. In the same way I can now include the individual volumes, called again by*and their respective name.That way I reduce errors as I only need to define everything once.
Found here: Don’t Repeat Yourself with Anchors, Aliases and Extensions in Docker Compose Files
Thanks folks!