Yes, i can see that pulling a large image would be slower the first time.
The 3 steps you’re describing sound like a prebuild, with a new image push in the last step. That would be expected from the init task in gitpod-vnc/.gitpod.yml at docker-hub · LukasBreitwieser/gitpod-vnc · GitHub
I have done a little more research about when Gitpod triggers a docker build, using the gitpod.Dockerfile inside your repo (like you have on master branch).
That docker build is only triggered when you modify the Dockerfile, not on every commit like the prebuild init task. So, you have to be careful to bump the Dockerfile if you’re copying other files from your repo into the image during the docker build.
Normally you would use an init task in a prebuild to do the heavier tasks which depend on (regularly changing) files in your repo so that users don’t wait for those in the startup commands.
If you can get these 2 things working (docker build for global installs etc, and prebuilds for file-dependent initialization) that should give your users the best chance of fast workspace starts.
Good luck, and let us know if you have more questions.