Skip Navigation

Is it possible to inherit declarations from one Docker-Compose.yaml to another?

I just installed Immich and while all my other containers have just required me to add to them to existing yaml, Immich requires its own yaml. That's fine I guess, but for the library, I wanna host it on my NAS and so I made the volume in my main Docker-Compose.yaml, the Immich yaml was all like, "what you talking about Willis?" because in my Immich environment I tried to point to something created in my main yaml. I thought I could work around this by adding an empty volume declaration, but now I can't find my uploads πŸ˜‚ any idea on the correct methodology/workaround?

4
4 comments
  • Answer has been solved but, just in case someone is curious about it: yes, is possible to extend a docker-compose.yaml file with another.

    From Docker's docs: https://docs.docker.com/compose/multiple-compose-files/extends/

    You can have a common-services.yml file (or whatever name you want to give to it) with a service defined inside, like this:

    services:
      webapp:
        build: .
        ports:
          - "8000:8000"
        volumes:
          - "/data"
    

    And then, in your docker-compose.yaml file just extend it with more specific things.

    services:
      web:
        extends:
          file: common-services.yml
          service: webapp
    
  • You cannot reference a part of a docker-compose file from another, but you can have an .env file alongside them where you can declare variables in the format NAME=VALUE, and reference that in the dc files with ${NAME}, assuming your dc files reside alongside each other (with different names) and the .env file itself. I have done this before.

    I cannot say if that will work for your use case, as I haven't tried to use the same docker volume in different containers. I don't even know if that is possible, given the possibility of conflicts if both containers tried to access the same files, something to test out, for sure.

    • It doesn't seem to work, as a result, I decided to just add the storage to the Immich yaml, but it's saying that there's an unknown variable still. I'm guessing that's because the environment file doesn't know of the storage. I don't suppose you know how to declare storage in an ENV do you?

  • Use a shared on-disk volume mount, i.e.:

    volumes:
      - /data/docker/stuff:/whatever
    

    In both compose files.

    I use a similar mechanism to enable my media acquisition stack to grab completed files and store them in their permanent location.

    Edit: you can just use the same volume in both containers at the same time, but you'd typically use an NFS mount or something if / when you try and scale this out. You probably just got the volume definition a little off (or need to create it outside both containers definitions and use it there)