vibhorgupta-gh / Argus

Update your Docker container to the latest base image effortlessly
GNU General Public License v3.0
30 stars 4 forks source link
automation docker docker-container docker-image jest typescript

Argus

Argus

Overview and Intent

A TypeScript-based cousin of watchtower, with support for semantically versioned image tags. Update your Docker container to the latest base image effortlessly.

Demo-GIF

Argus automatically updates your running Docker containers to the latest available image. The problem with managing docker images and containers manually, especially in an environment where containers are running across servers and need frequent updates due to constant images updates to the registry, is a series of CLI commands needed to update and rerun a container which quickly gets tiresome:

docker stop ...
docker rm ...
docker pull ...
docker run ...

Additionally, if you wish to cleanup redundant images, again docker rmi -f ....

Argus automates the job of updating Docker containers in favour of latest images available in an image registry. Assuming a developer is publishing new versions of a Docker image frequently for an application that resides in containers deployed on local/remote servers, the dev needs a way to propogate the image update to these containers. Traditionally, after SSHing in the remote machine the dev has to stop the existing container, pull the latest image as base, and restart the container. The entire process requires running a series of commands that get tedious, quick.

Automating the process of watching your containers, looking for latest images on a remote registry, exiting the running container, pulling the latest image and running a new container with the updated base ensures keeping up to date with newer, stable versions.


Capabilities


Usage

NPM package

Argus is available in the npm registry as a package. To use:

yarn global add argus-docker or npm i -g argus-docker

Docker Image

Argus is also deployed via docker image like so:

docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus

Options

All arguments can be used together without conflicts with the exception of -u and -p.

docker run --rm whaleit/argus --help

Using related flags:


Examples

Update containers on a remote host

Argus can monitor things other than just local, pass the --host argument to update a system with the Docker API exposed.

Defaults to /var/run/docker.sock

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus --host='tcp://some-remote-docker-server:2375'
  1. Running the npm package
argus --host='tcp://some-remote-docker-server:2375'

Change update interval

An interval argument can be supplied to change interval b/w argus checking the remote docker registry for image updates (in seconds).

Defaults to 300 seconds

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus --interval=900
  1. Running the npm package
argus --interval=900

Monitor select containers

Argus monitors all running docker containers, but can be overridden to only monitor select containers by passing monitor supplied with container names.

Defaults to all containers

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus --monitor='containerA','containerB','containerC'
  1. Running the npm package
argus --monitor='containerA','containerB','containerC'

Ignore select containers

Argus monitors all running docker containers, but can be overridden to ignore select containers by passing ignore supplied with container names.

Defaults to none

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus --ignore='containerA','containerB'
  1. Running the npm package
argus --ignore='containerA','containerB'

Update all containers once and quit

If you prefer Argus didn't run all the time and only update running containers once and exit, use the runonce argument and Argus terminates after updating all containers once.

Defaults to false

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus --runonce=true
  1. Running the npm package
argus --runonce=true

Remove old docker images

Argus has the option to remove the outdated base image if a new one is found and the container is updated. To clean up after updates, pass the cleanup argument.

Defaults to false

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus --cleanup=true
  1. Running the npm package
argus --cleanup=true

Private Registries

If base images to running containers are stored in a secure registry that requires credentials, you can run Argus with arguments --private-registry and --user and --password.

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus --user='myUser' --password='myPassword' --private-registry='some-registry.azure.io'
  1. Running the npm package
argus --user='myUser' --password='myPassword' --private-registry='some-registry.azure.io'

Credentials can also be passed via environment variables. Set the environment vars in your command line environment prior to running Argus like so:

export PRIVATE_REGISTRY=some-registry.azure.io
export REPO_USER=myUser
export REPO_PASS=myPassword

Semantically Versioned Tags

Credentials can be passed via CLI flags:

--user='myUser' --password='myPassword' --private-registry='some-registry.azure.io'

Credentials can also be passed via environment variables:

export PRIVATE_REGISTRY=some-registry.azure.io
export REPO_USER=myUser
export REPO_PASS=myPassword

Email notifications

Argus can send notifications to subscribers via email, detailing about the count of containers being updated and their new hashes.

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus --smtp-host='smtp.gmail.com' --smtp-port='587' --smtp-username='someaccount@gmail.com' --smtp-password='someaccountpass' --smtp-recipients='somereceiver@gmail.com,anotherreceiver@gmail.com' --smtp-sender='somesender@gmail.com'
  1. Running the npm package
argus --smtp-host='smtp.gmail.com' --smtp-port='587' --smtp-username='someaccount@gmail.com' --smtp-password='someaccountpass' --smtp-recipients='somereceiver@gmail.com,anotherreceiver@gmail.com' --smtp-sender='somesender@gmail.com'

Webhook notifications

Argus can broadcast notifiations to various platforms that support webhook POST urls, detailing about the count of containers being updated and their new hashes. Following platforms are supported (You're free to request for more platforms, preferably ones supporting webhooks):

Each of these platforms requires separate flags with platform specific information that can be passed independant of any other in this list. Webhook URLs, however, have to be necessarily passed in specifying comma separated webhook URL strings of said platforms. The pre-requisite is to register apps (Pushover, Slack)/ bots (Telegram)/ servers (Discord) and obtaining their webhook URLs.

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus --webhook-urls='https://discord.com/api/webhooks/some-url','https://hooks.slack.com/services/some-url' --pushover-token='<pushover_token>' --pushover-user='<pushover_user_key>' --pushover-device='<pushover_device>' --telegram-token='<identifier>:<token>' --telegram-chat='<telegram_chat_id>'
  1. Running the npm package
argus --smtp-host='smtp.gmail.com' --smtp-port='587' --smtp-username='someaccount@gmail.com' --smtp-password='someaccountpass' --smtp-recipients='somereceiver@gmail.com,anotherreceiver@gmail.com' --smtp-sender='somesender@gmail.com'

Prometheus metrics

Argus is enabled with Prometheus data exporter from which Prometheus can scrape for metrics. Argus fires up a server for Prometheus to attach to, hostname and port being specified by the user. Prometheus is disabled by default if no hostname and port is found.

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus --prometheus-host='http://127.0.0.1' --prometheus-port='8000'
  1. Running the npm package
argus --prometheus-host='http://127.0.0.1' --prometheus-port='8000'

You can also easily set up a Grafana dashboard for said metrics captured which require minimal changes to promotheus.yml config file on your system, and configuring your Grafana subdomain accordingly. An importable Grafana dashboard template is coming soon.

InfluxDB metrics

Argus is enabled with InfluxDB client which can write data to your local or hosted Influx service. User needs to start the Influx service and specify above mentioned parameters to activate influx exporter. InfluxDB is disabled by default if no URL and token is found.

  1. Running the docker image
docker run -d --name argus \
  -v /var/run/docker.sock:/var/run/docker.sock \
  whaleit/argus  --influx-token='<your_token>' --influx-url='http://127.0.0.1:8086/' --influx-org='<your_org>' --influx-bucket='<your_bucket>'
  1. Running the npm package
argus --influx-token='<your_token>' --influx-url='http://127.0.0.1:8086/' --influx-org='<your_org>' --influx-bucket='<your_bucket>'

You can easily query the data written by Argus in either the influx CLI or the dashboard UI (live on your influx-url) to observe metrics. You an also use the influx client libraries to query this data in your applications.


Development

Argus is built with Typescript and utilizes this Docker SDK.

Installation

Ensure you have the Docker engine installed and running. To setup a local copy, follow these simple steps.

npm i -g typescript
git clone https://github.com/VibhorCodecianGupta/Argus.git
yarn install

Running a prod build

yarn run build
yarn run start

Running in dev mode

yarn run dev

Contributing

Any and all contributions are welcome. You can check out Issue tracker and ongoing projects to look for existing issues and start contributing.

Feel free to open issues for any bugs you discover or any feature ideas you have. Do make sure to open an issue before moving to implementation. This ensures sufficient discussion and context to incoming PRs.

  1. Fork the Project
  2. Create your feature breanch: git checkout -b feature-branch
  3. Commit your Changes: git commit -m "Add some feature"
  4. Push to your fork: git push origin feature-branch
  5. Open a Pull Request.

If you like what you see, do consider leaving a star :)