Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker: copy file and directory with docker-compose

I created one Docker Image for a custom application which needs some license files (some files and one directory) to run, so I'm using the COPY command in the Dockerfile to copy license file to the image:

# Base image: Application installed on Debian 10 but unlicensed
FROM me/application-unlicensed

# Copy license files
COPY *.license /opt/application/
COPY application-license-dir /var/lib/application-license-dir

I use this Dockerfile to build a new image with the license for a single container. As I have 5 different licenses I created 5 different images each with one specific license file and directory.

The licenses are also fixed to a MAC Address, so when I run one of the five container I specify its own MAC Address with the --mac-address parameter:

docker run --rm --mac-address AB:CD:EF:12:34:56 me/application-license1

This work, but I wish to have a better and smarter way to manage this:

As with docker-compose is it possible to specify the container MAC Address, could I just use the unlicensed base image and copy license files and the license directory when I build the 5 containers with docker-compose?


Edit: let me better explain the structure of license files

The application is deployed into /opt/application directory into the Docker image.

License files (*.license) are into the /opt/application at the same level of the application itself, to they cannot be saved into a Docker volume unless I create some symlinks (but I have to check if the application will work this way).

The directory application-license-dir needs to be at /var/lib/application-license-dir, so it can be mounted into a Docker volume (I have to check if the application will work but I think so).

Both *.license files and the files into the application-license-dir are binary, so I cannot script or create them at runtime.

So:

  1. can docker-compose create a local directory on the Docker host server before binding and mounting it to a Docker volume?
  2. can docker-compose copy my licenses file and my license directory from the GIT repository (locally cloned) to the local directory created during the step 1?
  3. can docker-compose create some symlinks into the container's /opt/application directory for the *.license files stored into the volume?
like image 858
Mat Avatar asked May 11 '20 06:05

Mat


3 Answers

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.

like image 141
David Maze Avatar answered Oct 10 '22 09:10

David Maze


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

like image 43
Giga Kokaia Avatar answered Oct 10 '22 09:10

Giga Kokaia


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

like image 1
Kushal Billaiya Avatar answered Oct 10 '22 07:10

Kushal Billaiya