Pull a local image to run a pod in Kubernetes

I have the following image created by a Dockerfile:

REPOSITORY   TAG      IMAGE ID       CREATED       SIZE 
ruby/lab     latest   f1903b1508cb   2 hours ago   729.6 MB

And I have my following YAML file:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ruby-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: ruby
    spec:
      containers:
      - name: ruby-app
        image: ruby/lab
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 4567

When I create the deployment I got the following info in the pods:

ruby-deployment-3830038651-sa4ii   0/1       ImagePullBackOff   0          7m
ruby-deployment-3830038651-u1tvc   0/1       ImagePullBackOff   0          7m

And the error Failed to pull image "ruby/lab:latest": Error: image ruby/lab not found from below:

 8m            2m              6       {kubelet minikube}      spec.containers{ruby}   Normal          Pulling         pulling image "ruby/lab:latest"
 8m            2m              6       {kubelet minikube}      spec.containers{ruby}   Warning         Failed          Failed to pull image "ruby/lab:latest": Error: image ruby/lab not found
 8m            2m              6       {kubelet minikube}                              Warning         FailedSync      Error syncing pod, skipping: failed to "StartContainer" for "ruby" with ErrImagePull: "Error: image ruby/lab not found"

Is really necessary to have registry in docker for this? I just want to make test locally and pass my code/repo to a friend for testing purposes

Thanks


Solution 1:

You can point your docker client to the VM's docker daemon by running

eval $(minikube docker-env)

Then you can build your image normally and create your kubernetes resources normally using kubectl. Make sure that you have

imagePullPolicy: IfNotPresent

in your YAML or JSON specs.

Additionally, there is a flag to pass in insecure registries to the minikube VM. However, this must be specified the first time you create the machine.

minikube start --insecure-registry

You may also want to read this when using a private registry http://kubernetes.io/docs/user-guide/images/

Solution 2:

AFAIR minikube runs in a VM hence it will not see the images you've built locally on a host machine, but... as stated in https://github.com/kubernetes/minikube/blob/master/docs/reusing_the_docker_daemon.md you can use eval $(minikube docker-env) to actually utilise docker daemon running on minikube, and henceforth build your image on the minikubes docker and thus expect it to be available to the minikubes k8s engine without pulling from external registry