Feb 09, 2019

Simplifying Docker deployments with compose-deploy

When developing dockerized applications, you might stumble upon the sheer difficulty and annoyance of simply deploying your Compose file along with built service images. If you're not using a full cloud setup and instead want to deploy to a small number of machines, you're left with doing it manually or going for complete automation. At least that was the case until now - I'm happy to introduce compose-deploy. As the name suggests, it is a simple CLI tool that helps you with defining and running your deployments with ease.

Let's go through an example deployment to grasp how easy it actually is to deploy a simple hello-world service to our server. Our Compose file looks like the following

version: '3.7'
services:
  demo:
    build: .
    image: brunoscheufler/demo-service:1.0.0
    restart: on-failure
    init: true
    environment:
      NODE_ENV: production

and our compose-deploy configuration contains

name: sample-deployment
targets:
  - host: 'my-server-ip'
    username: deploy-user
    privateKeyFile: ./key/id_rsa
    passphrase: 'SECRET PASSPHRASE'
composeFile: ./docker-compose.yml

Now we're ready to run the deployment!

$ compose-deploy
šŸ”Ø Building Docker images...
Building demo
Step 1/4 : FROM node:11-alpine
 ---> ebbf98230a82
Step 2/4 : WORKDIR /app
 ---> Using cache
 ---> 311a77c5bbda
Step 3/4 : COPY index.js /app
 ---> Using cache
 ---> 994482d9b3d0
Step 4/4 : CMD node index.js
 ---> Using cache
 ---> aa2745a3fd0c

Successfully built aa2745a3fd0c
Successfully tagged brunoscheufler/demo-service:1.0.0
šŸŒŽ Pushing Docker images...
Pushing demo (brunoscheufler/demo-service:1.0.0)...
The push refers to repository [docker.io/brunoscheufler/demo-service]
1.0.0: digest: sha256:<LONG_HASH> size: 1364
šŸŽÆ Deploying services...
šŸ’« Deploying to target 1 of 1...
šŸ“” Connecting to target server
šŸ„ Connected! Copying Compose file...
Removing network sample_default
šŸ“¦ Pulling Docker images...
Pulling demo ... done
āš”ļø Launching deployment...
Creating network "sample_default" with the default driver
Creating sample_demo_1 ... done
āœ… Deployment done!

And that's it! We've now deployed our demo service in less than thirty seconds. It works like magic āœØ If you're interested, head over to the repository and give it a try!