How can I use a local image as the base image with a dockerfile?

Docker

Docker Problem Overview


I'm working on a dockerfile. I just realised that I've been using FROM with indexed images all along.

So I wonder:

  • How can I use one of my local (custom) images as my base (FROM) image without pushing it to the index?

Docker Solutions


Solution 1 - Docker

You can use it without doing anything special. If you have a local image called blah you can do FROM blah. If you do FROM blah in your Dockerfile, but don't have a local image called blah, then Docker will try to pull it from the registry.

In other words, if a Dockerfile does FROM ubuntu, but you have a local image called ubuntu different from the official one, your image will override it.

Solution 2 - Docker

Verified: it works well in Docker 1.7.0.

Don't specify --pull=true when running the docker build command

From this thread on reference locally-built image using FROM at dockerfile:

> If you want use the local image as the base image, pass without the option --pull=true
--pull=true will always attempt to pull a newer version of the image.

Solution 3 - Docker

For anyone who faces this issue in the future, where you have the image in your local but docker build still tries to pull the image from docker hub, the problem might be that the architecture types are different.

Trying to pull from docker.io even though image exists

You can check the architecture of the image using

docker inspect --format='{{.Os}}/{{.Architecture}}' IMAGE_NAME

Now in your Dockerfile change FROM IMAGE_NAME to something like FROM --platform=linux/amd64 IMAGE_NAME and docker would now use the local image.

Solution 4 - Docker

You can have - characters in your images. Assume you have a local image (not a local registry) named centos-base-image with tag 7.3.1611.

docker version 
      Client:
       Version:         1.12.6
       API version:     1.24
       Package version: docker-common-1.12.6-16.el7.centos.x86_64
       Go version:      go1.7.4

      Server:
       Version:         1.12.6
       API version:     1.24
       Package version: docker-common-1.12.6-16.el7.centos.x86_64
       Go version:      go1.7.4

docker images
 REPOSITORY            TAG
 centos-base-image     7.3.1611

Dockerfile

FROM centos-base-image:7.3.1611
RUN yum -y install epel-release libaio bc flex

Result

Sending build context to Docker daemon 315.9 MB
Step 1 : FROM centos-base-image:7.3.1611
  ---> c4d84e86782e
Step 2 : RUN yum -y install epel-release libaio bc flex
  ---> Running in 36d8abd0dad9
...

In the example above FROM is fetching your local image, you can provide additional instructions to fetch an image from your custom registry (e.g. FROM localhost:5000/my-image:with.tag). See https://docs.docker.com/engine/reference/commandline/pull/#pull-from-a-different-registry and https://docs.docker.com/registry/#tldr

Finally, if your image is not being resolved when providing a name, try adding a tag to the image when you create it

This GitHub thread describes a similar issue of not finding local images by name.

> By omitting a specific tag, docker will look for an image tagged "latest", so either create an image with the :latest tag, or change your FROM

Solution 5 - Docker

Remember to put not only the tag but also the repository in which that tag is, this way:

docker images
REPOSITORY                                TAG                       IMAGE ID            CREATED             SIZE
elixir                                    1.7-centos7_3             e15e6bf57262        20 hours ago        925MB

You should reference it this way:

elixir:1.7-centos7_3

Solution 6 - Docker

For users with M1 chips, problem can be arisen when platform differs of local image differs from target Dockerfile. In my case, I've built base image with M1 support and then tried to use command FROM in image that was building with platform linux/amd64

Solution 7 - Docker

Our /etc/docker/daemon.json had a line declaring

"disable-legacy-registry" : true,

With that line in, the local registry was refusing access.
With it removed, it's working.

Solution 8 - Docker

I just ran into this on an M1 Mac with engine version 20.10.14. It wasn't obvious from docker build --help, but passing --pull=false worked for me.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPhilView Question on Stackoverflow
Solution 1 - DockerjpetazzoView Answer on Stackoverflow
Solution 2 - DockerDmitriusanView Answer on Stackoverflow
Solution 3 - DockerAnuj BansalView Answer on Stackoverflow
Solution 4 - Dockersteven87vtView Answer on Stackoverflow
Solution 5 - DockerRowinson GallegoView Answer on Stackoverflow
Solution 6 - DockerЄвгеній ГизилаView Answer on Stackoverflow
Solution 7 - DockerPaul HodgesView Answer on Stackoverflow
Solution 8 - DockerturboladenView Answer on Stackoverflow