44

I'm trying to use minikube and kitematic for testing kubernetes on my local machine. However, kubernetes fail to pull image in my local repository (ImagePullBackOff).

I tried to solve it with this : Can not pull docker image from private repo when using Minikube

But I have no /etc/init.d/docker, I think it's because of kinematic ? (I am on OS X)

EDIT :

I installed https://github.com/docker/docker-registry, and

docker tag local-image-build localhost:5000/local-image-build

docker push localhost:5000/local-image-build

My kubernetes yaml contains :

spec:
  containers:
  - name: backend-nginx
    image: localhost:5000/local-image-build:latest
    imagePullPolicy: Always

But it's still not working... Logs :

Error syncing pod, skipping: failed to "StartContainer" 
for "backend-nginx" with ErrImagePull: "Error while pulling image: 
Get http://127.0.0.1:5000/v1/repositories/local-image-build/images: 
dial tcp 127.0.0.1:5000: getsockopt: connection refused

EDIT 2 :

I don't know if I'm on the good path, but I find this :

http://kubernetes.io/docs/user-guide/images/

But I don't know what is my DOCKER_USER...

kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

EDIT 3

now I got on my pod :

Failed to pull image "local-image-build:latest": Error: image library/local-image-build not found
Error syncing pod, skipping: failed to "StartContainer" for "backend-nginx" with ErrImagePull: "Error: image library/local-image-build not found"

Help me I'm going crazy.

EDIT 4

Error syncing pod, skipping: failed to "StartContainer" for "backend-nginx" with ErrImagePull: "Error response from daemon: Get https://192.168.99.101:5000/v1/_ping: tls: oversized record received with length 20527"

I added :

EXTRA_ARGS='
    --label provider=virtualbox
    --insecure-registry=192.168.99.101:5000

to my docker config, but it's still don't work, the same message....

By the way, I changed my yaml :

 spec:
      containers:
      - name: backend-nginx
        image: 192.168.99.101:5000/local-image-build:latest
        imagePullPolicy: Always

And I run my registry like that :

docker run -d -p 5000:5000 --restart=always --name myregistry registry:2
kellyfj
  • 5,985
  • 8
  • 42
  • 64
Xero
  • 3,621
  • 4
  • 38
  • 68
  • Did you actually run the registry? The command to do it is `docker run -d -p 5000:5000 --name registry registry:2` – Nebril Aug 24 '16 at 11:02
  • What about using the docker registry in the minikube registry? – paul Jun 22 '17 at 21:56

11 Answers11

36

Use the minikube docker registry instead of your local docker

https://kubernetes.io/docs/tutorials/stateless-application/hello-minikube/#create-a-docker-container-image

Set docker to point to minikube

eval $(minikube docker-env)

Push to minikube docker

docker build -t hello-node:v1 .

Set your deployment to not pull IfNotPresent

K8S default is set to "Always" Change to "IfNotPresent"

imagePullPolicy: IfNotPresent

Related Issue

Doug
  • 12,568
  • 14
  • 67
  • 104
  • thanks, quick and easy(in my view, correct solution for the stated problem). btw, first step (eval) is not required if minikube is started with "--vm-driver=none". – Sateesh Aug 03 '18 at 12:53
15

I think I solved by doing

minikube start --vm-driver="virtualbox" --insecure-registry="$REG_IP":80

instead of just

minikube start

$REG_IP is :

REG_IP=docker-machine ip registry

Source

Xero
  • 3,621
  • 4
  • 38
  • 68
3

If you're using --vm-driver=none, you'll need to set imagePullPolicy to Never.

imagePullPolicy: Never: the image is assumed to exist locally. No attempt is made to pull the image.

Homer6
  • 14,541
  • 11
  • 57
  • 79
1

in my case, I had to do the following steps.

$ eval $(minikube docker-env)

$ minikube config set driver virtualbox

$ minikube start

Shree Prakash
  • 1,822
  • 2
  • 21
  • 32
1

As per the kubernetes documentation here: https://kubernetes.io/docs/concepts/containers/images/#imagepullpolicy-defaulting

If you use the latest tag for deployment then it will try to pull image. I was able to deploy service with v1 tag after following steps on WSL-2

  1. eval $(minikube -p minikube docker-env)
  2. minikube start
  3. docker build --tag=my-service:v1 .
  4. kubectl create deployment my-service --image=my-service:v1
  5. kubectl expose pod "my-service" --type=NodePort --port=8080
  6. minikube service my-serivce
0

Adding --insecure-registry="$REG_IP":80 does not seem to work for me.

I have to use wlredeye's answer at Can not pull docker image from private repo when using Minikube to get it working:

For an http registry this steps works for me:

  1. minikube ssh
  2. edit /var/lib/boot2docker/profile and add to $EXTRA_ARGS --insecure-registry 192.168.99.1(your local machine's IP):5000
  3. restart the docker daemon sudo /etc/init.d/docker restart
  4. Verify you can access the docker registry curl -s -S http://192.168.99.1/v2/_catalog

This is minikube version: v0.14.0

Community
  • 1
  • 1
Y. Zhang
  • 9
  • 2
  • Two questions about this one. By "local machine's IP" you mean "the IP of the registry" right? Also how *exactly* are you "adding to" that variable. – John Carrell Mar 30 '17 at 22:18
  • I added the line: EXTRA_ARGS --insecure-registry 192.168.99.1:5000, but I get an error with $ sudo /etc/init.d/docker restart sudo: /etc/init.d/docker: command not found – staticdev Mar 09 '19 at 14:55
0

First you need to start a local registry, seems you have done it.

docker run -d -p 5000:5000 --restart=always --name myregistry registry:2

You can check your minikube IP by ifconfig

There should be output (after minikube start using virtualbox as VMdriver) looks like:

vboxnet0 Link encap:Ethernet HWaddr 0a:00:27:00:00:00
inet addr:192.168.99.1 Bcast:192.168.99.255 Mask:255.255.255.0 inet6 addr: fe80::800:27ff:fe00:0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:515 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:86256 (86.2 KB)

Using

minikube start --insecure-registry=192.168.99.1:5000

You can actually check whether you can pull your own images simply by (within minikube)

docker pull 192.168.99.1:5000/your_own_repo/your_own_images

Hope this might help.

M. Pong
  • 1
  • 1
0

in Mac I have problem with dns-resolving in minikube, as /etc/resolv.conf was configured with my mac ip. I didn't have installed dns server locally, so minikube couldn't resolve anything.

I solved this with install locally dns-server

brew install dnsmasq
sudo brew services start dnsmasq
panser
  • 1,643
  • 20
  • 15
0

in Mac I had docker client installed so I had to do

minikube config set driver docker
minikube start
Dharman
  • 26,923
  • 21
  • 73
  • 125
sky
  • 207
  • 3
  • 10
0

Start minikube

minikube start --insecure-registry "10.0.0.0/24,192.168.39.0/24"
minikube addons enable registry

Find minikube IP

minikube ip

Setup docker/insecure-registry

# edit /etc/docker/daemon.json
{
  ...
  "insecure-registries": [ "your-minikube-ip:5000" ]
  ...
}

Push your image

docker build --tag $(minikube ip):5000/local-image-build:latest
docker push $(minikube ip):5000/local-image-build:latest

Enjoy it.

See:
https://minikube.sigs.k8s.io/docs/handbook/pushing/#4-pushing-to-an-in-cluster-using-registry-addon

cupen
  • 147
  • 1
  • 7
0

Check this great article: How to Run Locally Built Docker Images in Kubernetes

My Environment

  • OS: Debian
  • Version: 11 (Bullseye)
  • Minikube: v1.24.0
  • Kubectl: v1.22.4
  • Docker: 20.10.5+dfsg1

It covers all wrong image stages and workarounds.

Stages

ErrImagePull

Edit deployment.yaml and add imagePullPolicy: Never:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-local-deployment
spec:
  template:
    metadata:
      name: my-pod
    spec:
      containers:
      - name: my-container
        image: my-local-image    # The one built and tagged locally
        imagePullPolicy: Never   # So it doesn't pull the image from remote registry

ErrImageNeverPull

Run: eval $(minikube -p minikube docker-env)

that outputs environment variables needed to point the local Docker daemon to the minikube internal Docker registry

Finally

Rebuild the image, to install it in minikube registry:

docker build . -t my-image

Felix Aballi
  • 779
  • 1
  • 12
  • 31