I've been wrestling with my Docker image size, and despite trying various optimization tricks, it's still ballooning to 3GB due to some stubborn client dependencies. What's really frustrating is that when I use GitHub Actions for my builds, it downloads the entire image every time because the runners are ephemeral. Even with caching, there's no persistent state to rely on, resulting in painfully slow build times.
I'm currently using Microsoft Azure, and I'm toying with the idea of switching to a custom runner that utilizes hot-mounted persistent storage to reduce costs and maintain state between builds. What options am I overlooking to achieve a faster and smarter solution? I know building locally on my Mac is much quicker—under 20 seconds for the same image—so there must be a more efficient setup out there.
1 Answer
It sounds like you're facing some common Docker buildup issues, but without seeing your Dockerfile, it's tough to give precise advice. I recommend sharing that along with more details about your app and how you've structured your pipeline. Until then, everything is hard to diagnose because we can't see where your optimizations might be lacking.

Here’s my Dockerfile [link](https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false)&input=SXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXdvandxQWd3cUFnd3FBZ1FrRlRSU0JKVFVGSFJTQlRSVlJWVU1LZ0lNS2dJQ01LSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXdvS1JsSlBUU0J0WTNJdWJXbGpjbTl6YjJaMExtTnZiUzl3YkdGNWQzSnBaMmgwTDNCNWRHaHZianAyTVM0ME55NHdMV3BoYlcxNUNnb2pJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TUtDbEpWVGlCbFkyaHZJQ2RCWTNGMWFYSmxPanBSZFdWMVpTMU5iMlJsSUNKaFkyTmxjM01pT3lCQlkzRjFhWEpsT2pwU1pYUnlhV1Z6SUNJeklqc25JRDRnTDJWMFl5OWhjSFF2WVhCMExtTnZibVl1WkM4NU9YTndaV1ZrSUNZbUlGd0t3cUFnd3FBZ1pXTm9ieUFuUVZCVU9qcEhaWFE2T2tGemMzVnRaUzFaWlhNZ0luUnlkV1VpT3lCQlVGUTZPa2x1YzNSaGJHd3RVbVZqYjIxdFpXNWtjeUFpWm1Gc2MyVWlPeUJCVUZRNk9rbHVjM1JoYkd3dFUzVm5aMlZ6ZEhNZ0ltWmhiSE5sSWpzbklENCtJQzlsZEdNdllYQjBMMkZ3ZEM1amIyNW1MbVF2T1RsemNHVmxaQ0FtSmlCY0NzS2dJTUtnSUdWamFHOGdKMEZqY1hWcGNtVTZPbWgwZEhBZ2V5QlFhWEJsYkdsdVpTMUVaWEIwYUNBaU5TSTdJSDA3SUVGamNYVnBjbVU2T21oMGRIQnpJSHNnVUdsd1pXeHBibVV0UkdWd2RHZ2dJalVpT3lCOU95Y2dQaUF2WlhSakwyRndkQzloY0hRdVkyOXVaaTVrTHprNWNHRnlZV3hzWld3Z0ppWWdYQXJDb0NEQ29DQmhjSFF0WjJWMElIVndaR0YwWlNBbUppQmNDc0tnSU1LZ0lFUkZRa2xCVGw5R1VrOU9WRVZPUkQxdWIyNXBiblJsY21GamRHbDJaU0JoY0hRdFoyVjBJR2x1YzNSaGJHd2dMWGtnTFMxdWJ5MXBibk4wWVd4c0xYSmxZMjl0YldWdVpITWdYQXJDb0NEQ29DRENvQ0RDb0NCd2VYUm9iMjR6TFdSbGRpQmNDc0tnSU1LZ0lNS2dJTUtnSUdSbFptRjFiSFF0YkdsaWJYbHpjV3hqYkdsbGJuUXRaR1YySUZ3S3dxQWd3cUFnd3FBZ3dxQWdjR3RuTFdOdmJtWnBaeUJjQ3NLZ0lNS2dJTUtnSU1LZ0lHSjFhV3hrTFdWemMyVnVkR2xoYkNBbUppQmNDc0tnSU1LZ0lHRndkQzFuWlhRZ1kyeGxZVzRnSmlZZ1hBckNvQ0RDb0NCeWJTQXRjbVlnTDNaaGNpOXNhV0l2WVhCMEwyeHBjM1J6THlvS0NpTWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TUtJeURDb0NEQ29DQkZUbFpKVWs5T1RVVk9WQ0JXUVZKVElNS2dJTUtnSUNNS0l5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl3b0tSVTVXSUZCWlZFaFBUa1JQVGxSWFVrbFVSVUpaVkVWRFQwUkZQVEVnWEFyQ29DRENvQ0JRV1ZSSVQwNVZUa0pWUmtaRlVrVkVQVEVnWEFyQ29DRENvQ0JDVWs5WFUwVlNYMUJCVkVnOUwzUnRjQzh1Y0d4aGVYZHlhV2RvZENCY0NzS2dJTUtnSUZORlVsWkpRMFU5WkdWbVlYVnNkQ0JjQ3NLZ0lNS2dJRmRQVWt0RlVsOVFUMDlNUFhSb2NtVmhaSE1nWEFyQ29DRENvQ0JYVDFKTFJWSmZRMDlWVGxROU9DQmNDc0tnSU1LZ0lGUkJVMHRmVTBOSVJVUlZURVZTUFhOamFHVmtkV3hsY2k1RmJuUnllVkJ2YVc1MENnb2pJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpDaVBDb0NEQ29DRENvQ0JRV1ZSSVQwNGdVMFZVVlZEQ29DRENvQ0RDb0NEQ29DQWpDaU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1qSXlNakl5TWpJeU1LQ2xKVlRpQnliU0F0Y21ZZ2ZpOHVZMkZqYUdVdmNHbHdJQzl5YjI5MEx5NWpZV05vWlNBdmRHMXdMeW9LQ2xkUFVrdEVTVklnTDI5d2RDOWhjSEFLQ2tOUFVGa2djbVZ4ZFdseVpXMWxiblJ6TG5SNGRDQXVDZ3BTVlU0Z2NIbDBhRzl1SUMxdElIQnBjQ0JwYm5OMFlXeHNJSFYySUNZbUlGd0t3cUFnd3FBZ2RYWWdjR2x3SUdsdWMzUmhiR3dnTFMxemVYTjBaVzBnTFhJZ2NtVnhkV2x5WlcxbGJuUnpMblI0ZEFvS1EwOVFXU0F1SUM0S0NrVllVRTlUUlNBNE1EQXdDZ3BEVFVRZ1d5Sm5kVzVwWTI5eWJpSXNJQ0poY0hBdWQzTm5hVHBoY0hCc2FXTmhkR2x2YmlJc0lDSXRMV0pwYm1RaUxDQWlNQzR3TGpBdU1EbzRNREF3SWl3Z0lpMHRkMjl5YTJWeWN6MDBJaXdnSWkwdGRHaHlaV0ZrY3oweUlsMEs)!