Good CI tooling like Jenkins can do much more than the things we covered here; they all require significant investment of time and effort to get working, but the benefits are pretty significant if you can get them implemented:
- Self-building: As mentioned in the workaround previously, you can have Jenkins build its own image when the configuration changes and have it redeploy itself.
- Deployment of only changed Docker images: If you use Docker caching, you can check whether the new build created a different image hash and only deploy if it did. Doing this will prevent pointless work and have your infrastructure always running the newest code.
- Timed Docker pruning: You can run cleanup jobs (or any other jobs similar ...