How to Run Locally Built Docker Images in Kubernetes
--
While working with Kubernetes locally, you may want to run some locally built Docker images in Kubernetes. This may not work out-of-the-box, because minikube uses its own local Docker registry that’s not connected to the one on your local machine.
In this article, I’ll show how easy it is to run locally built images in Kubernetes, without publishing them to a global registry. For this article, I suppose you already have kubectl and minikube installed locally. This article is targeted at the Linux environment.
I start with creating the following trivial Dockerfile
that runs busybox and outputs “Hello World”:
FROM busyboxCMD [“echo”, “Hello World!”]
I now build it:
> docker build . -t forketyfork/hello-world
I can now run a container from this image and see that it works as expected:
> docker run forketyfork/hello-world
Hello World!
Next, I create the helloworld.yml
configuration file to run this container as a Kubernetes job:
apiVersion: batch/v1
kind: Job
metadata:
name: hello-world
spec:
template:
metadata:
name: hello-world-pod
spec:
containers:
- name: hello-world
image: forketyfork/hello-world
restartPolicy: Never
Notice that I’ve specified the name of the image I just built and set the restartPolicy
to Never
so that it would only run once and terminate.
I now try to create a job out of this configuration file using kubectl
:
> kubectl create -f helloworld.yml
Let’s check if it worked, using the kubectl get pods
command:
> kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-lfrzh 0/1 ErrImagePull 0 6s
It didn’t work, and the pod failed with the ErrImagePull
status. The reason is Kubernetes tries to pull the image specified in helloworld.yml
, but this image is neither in the minikube
docker registry nor in the public Docker registry.
I don’t want to pull this image from a public registry since it’s only available locally. I fix this by setting the…