CrimsonTome's blog

Automating container updates with Ouroboros

image

A few months ago, I started learning about containers using Docker. This has certainly been a fun experience overall (though sometimes frustrating 😛). One issue with this is rebuilding the container upon every update when you want to deploy the new image.

There is however a solution to this problem thankfully. A good friend Kieran, who also started learning Docker at around the same time as myself introduced me to Ouroboros. Kieran uses this to keep his many Discord bots up to date without having to manually rebuild and bring up each container over and over again, and this seems to work pretty well. It is unfortunate that the project has now been abandonned (last commit in 2020). However the software still functions as it should. The following guide assumes you have some basic experience with Docker. If you have no experience then there are a couple of good posts by Kieran Robson here on how to setup docker and portainer.

To set this up you will need:

Docker CI

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: Publish Docker image

on:
push:
branches:
- "main"

jobs:
push_to_registries:
name: Push Docker image to multiple registries
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- name: Check out the repo
uses: actions/checkout@v3

- name: Log in to Docker Hub
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: $
password: $

- name: Log in to the Container registry
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
registry: ghcr.io
username: $
password: $

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: |
$/YOUR-IMAGE-NAME-HERE
ghcr.io/$


- name: Build and push Docker images
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: $
labels: $
  • now go back to the action code and save it
  • with any luck after some time you should have something like this in your actions tab

Ouroboros setup

  • To run Ouroboros:
docker run -d --name ouroboros \
-v /var/run/docker.sock:/var/run/docker.sock \
pyouroboros/ouroboros
  • Then with the containers involved:

    • stop the containers
    • run the snippet below, filling in the details you need to
docker run -d \
--name=INSERT NAME \
-p AN-UNUSED-PORT:THE-PORT-THE-SERVICE-RUNS-ON \
--restart unless-stopped \
DOCKERHUB-USERNAME/IMAGE:TAG

Note that the tag used in this workflow is main.

With any luck you should now have containers automatically update once you push changes to GitHub.