How to Create a Docker-Compose Deployment Using Multiple Files

This guide walks you through how to create a docker-compose deployment using multiple files. We start by creating a simple compose file where it uses the nginx image that will serve a page in a directory that is passed into the container via a mount.

Note: The volume mount is relative to the root directory of where you will be building your .zip file. In our case, we will have a data directory that will be mounted into the container. This directory will be named data and will be mounted read-only, although it is possible to make this mount read/write.

docker-compose.yml

version: '3'  
services:
web:
  image: nginx
  volumes:
      - ./data:/usr/share/nginx/html:ro
  ports:
    - "80:80"
  command: [nginx-debug, '-g', 'daemon off;']  

Our page is a very simple HTML page that tells us that things worked.

data/index.html

<!DOCTYPE html>
<html>
    <head>
        <title>Included File Test</title>
    </head>
    <body>
        <p>If you're seeing this, the included file worked...</p>
    </body>
</html>  

We now create a manifest file that provides a path to our compose file (in this case, we are only using one file but this method allows you to use multiple files if necessary).

manifest.yml

dockercomposefiles:
- docker-compose.yml  

Our directory structure looks like this:

├── data
│   └── index.html
├── docker-compose.yml
└── manifest.yml  

We now create our .zip file:

$ zip -r compose-test.zip *
updating: data/ (stored 0%)
updating: docker-compose.yml (deflated 18%)
updating: data/index.html (deflated 32%)
  adding: manifest.yml (deflated 17%)  

Now, the file can either be uploaded to Artifactory (preferred method, since it uses the Artifactory security settings) or via a web server. Note that if you use a web server, EdgeXR will need to be able to access it, which does not allow for the use of authentication.

$ curl -q -u demo -T ./compose-test.zip https://console.cloud.edgexr.org/storage/v1/artifacts/demoorg/compose-test.zip
Enter host password for user 'demo':
{
  "repo" : "repo-demoorg",
  "path" : "/compose-test.zip",
  "created" : "2020-05-21T15:42:12.759Z",
  "createdBy" : "demo",
  "downloadUri" : "https://console.cloud.edgexr.org/storage/v1/artifacts/demoorg/compose-test.zip",
  "mimeType" : "application/zip",
  "size" : "909",
  "checksums" : {
    "sha1" : "696ca6354935c0fabc2b4e9853b77d1d259412f3",
    "md5" : "6075b505ca0e7417a213ccb8fe5c91d7",
    "sha256" : "666eac3c030ba5a58e738e4b79f7f326c14fcecb38a3284fb3c1d5510fcddcc1"
  },
  "originalChecksums" : {
    "sha256" : "666eac3c030ba5a58e738e4b79f7f326c14fcecb38a3284fb3c1d5510fcddcc1"
  },
  "uri" : "https://console.cloud.edgexr.org/storage/v1/artifacts/demoorg/compose-test.zip"
}  

Once you have received confirmation in the form of the json format returned above, you can move on to the steps for deploying a docker instance through the EdgeXR Edge-Cloud Console. There are two important things to keep in mind:

  • You should leave the Image Path field blank in the console.

  • You should provide the full URL for the .zip file in the Deployment Manifest text box. For example, the above .zip file should be referenced as https://console.cloud.edgexr.org/storage/v1/artifacts/demoorg/compose-test.zip.