Boris Burkov
Boris Burkov

Reputation: 14446

Update of operating system takes forever, while building Docker image

I'm using Debian:latest as the base image for my Docker containers.

Problem is that on every build I have to update the OS packages, which takes forever. Here is what I do:

FROM debian:latest

RUN apt-get update && apt-get install -y --force-yes --no-install-recommends nginx

...

apt-get update && apt-get install lasts forever. What do I do about this?

Upvotes: 0

Views: 608

Answers (2)

OscarAkaElvis
OscarAkaElvis

Reputation: 5714

Don't delete image on each build. Just modify your Dockerfile and build again. Docker is "smart" and it will keep unmodified layers building only from lines you changed. That intermediate images used for this purpose (docker is creating them automatically) can be easily removed with this command:

docker rmi $(docker images -q -f dangling=true)

You'll save a lot of time with this.Remember, don't delete image. Just modify the Dockerfile and build again. And after finishing with everything working lauch this command and that's all you need.

Another "good to launch for cleaning command" can be:

docker volume prune -f

But this last command is for other kind of cleaning not related to images... is more focused on containers.

Upvotes: 1

BMitch
BMitch

Reputation: 263866

Docker images are minimal, only including the absolute necessities to run that base image. For the Debian base images, that means there is no package repo cache. So when you run an apt-get update it is downloading a the package repo cache for the first time from all the repos. If they included the package repo cache, it would be many megs of package state that would be quickly out of date, resulting in larger base images with little reduction on doing an update later.

The actual debian:latest image is relatively well maintained with commits from last month. You can view the various tags for it here: https://hub.docker.com/_/debian/

To reduce your image build time, I'd recommend not deleting your image every time. Instead, do your new build and tag, and once the new image is built, you can run a docker image prune --force to remove the untagged images from prior builds. This allows docker to reuse the cache from prior image builds.

Alternatively, you can create your own base image that you update less frequently and that has all of your application prerequisites. Build it like any other image, and then change the FROM debian:latest to FROM your_base_image.

One last tip, avoid using latest in your image builds, do something like FROM debian:9 instead so that a major version update in debian doesn't break your build.

Upvotes: 4

Related Questions