Deleting unused docker images "automatically"

Deleting unused docker images "automatically"

So I have a cheap server with no single source code, all apps are managed under docker images. I rarely do ssh to my server, since I'm using GitLab CI/CD to deploy my app.

Then I just got email from GitLab telling me that one of my pipeline was fail. I do CI (build & test) in every PR/new branch and using full pipeline only when merging to primary branch, so I curious by that email since the build & test process was pass.

Yeah, this is common problem. My data directory was only ~963M, but my df -h was used ~13G. I know this is mostly from either docker images and docker container.

Solution

Let me tell you how my docker images looks like.

And this is my docker process looks like

I have 10 apps running with 3 different kind databases. All my apps that deployed via CI/CD I only care with staging or latest tag, otherwise I'm assumed it was 'old version'.

And I need to remove it to keep my fs lean.

The Old way

All my unused images are basically has <none> on their version tag. I can do

docker images | grep "<none>"

For it and remove the images.

But now I rarely ssh-ing to my server, mostly because my lazyness. I need a clever way to do that without making my hand dirty.

Sooo it was a combination between Cron + some command. The conclusion from this post.

The new way

I need to delete all unused images, checked every 1 hour. Because this was a lean command that doesn't need heavy cpu and if there is no unused images, docker will simply do nothing.

First of all, we need to check it with command previously

docker images | grep "<none>"

Docker will give you some output, but all you need is only its ID. I know some awk so let's take only the third column.

After that we can use this command to delete the (unused) images.

docker rmi $(docker images | grep "<none>" | awk '{print $3}')

That's it.

cron cron cron

Above command was solves my problem, but I need to make it more lazy to save me more time. Thanks GNU/Linux, we have cron! So I set some cron script every hour to execute the script.

It works!

Although I use zsh and bash, I prefer to execute the script via sh after doing some "hello world" benchmark here.

Conclusion

All you need is only save this shell script:

docker rmi $(docker images | grep "<none>" | awk '{print $3}')

in somewhere, tell cron to execute it, than, enjoy your life. This solution is not best but at least works for me.