Docker: copy file and directory with docker-compose

For things that are different every time you run a container or when you run a container on a different system, you generally don't want to specify these in a Dockerfile. This includes the license files you show above; things like user IDs also match this pattern; depending on how fixed your configuration files are they can also count. (For things that are the same every time you run the container, you do want these in your image; especially this is the application source code.)

You can use a Docker bind mount to inject files into a container at run time. There is Compose syntax for bind mounts using the volumes: directive.

This would give you a Compose file roughly like:

version: '3'
services:
  app1:
    image: me/application-unlicensed
    volumes:
      - './app1.license:/opt/application/app.license'
      - './application-license-dir:/var/lib/application-license-dir'
    mac_address: 'AB:CD:EF:12:34:56'

Bind mounts like this are a good match for pushing configuration files into containers. They can provide an empty host directory into which log files can be written, but aren't otherwise a mechanism for copying data out of an image. They're also useful as a place to store data that needs to outlive a container, if your application can't store all of its state in an external database.


According to this commit docker-compose has mac_address support. Mounting license files with -v could be an option.


You can set mac_address for the different containers as mac_address: AB:CD:EF:12:34:12. For documentation reference see this

For creating multiple instances from the same image, you will have to copy paste each app block 5 times in your docker-compose file and in each you can set a different mac_adddress