docker kubectl get pods显示ErrImagePull

axkjgtzd  于 11个月前  发布在  Docker
关注(0)|答案(6)|浏览(114)

我尝试使用我的本地Docker镜像创建一个pod,如下所示。
1.首先我在终端运行这个命令

eval $(minikube docker-env)

字符串
2.我创建了一个docker镜像,如下所示

sudo docker image build -t my-first-image:3.0.0 .


3.我创建了如下所示的pod.yml,并运行以下命令

kubectl -f create pod.yml.


4.然后我试着运行这个命令

kubectl get pods


但它显示以下错误

NAME                             READY   STATUS             RESTARTS   AGE
multiplication-b47499db9-phpb7   0/1     ImagePullBackOff   0          23h
my-first-pod                     0/1     ErrImagePull       0          7s


5.我得到了豆荚日志

kubectl describe pod my-first-pod
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  99s                default-scheduler  Successfully assigned default/my-first-pod to minikube
  Warning  Failed     41s (x3 over 94s)  kubelet, minikube  Failed to pull image "my-first-image:3.0.0": rpc error: code = Unknown desc = Error response from daemon: pull access denied for my-first-image, repository does not exist or may require 'docker login'
  Warning  Failed     41s (x3 over 94s)  kubelet, minikube  Error: ErrImagePull
  Normal   BackOff    12s (x4 over 93s)  kubelet, minikube  Back-off pulling image "my-first-image:3.0.0"
  Warning  Failed     12s (x4 over 93s)  kubelet, minikube  Error: ImagePullBackOff
  Normal   Pulling    0s (x4 over 98s)   kubelet, minikube  pulling image "my-first-image:3.0.0"
Dockerfile

    FROM node:carbon
    WORKDIR /app
    COPY . .
    CMD [ "node", "index.js" ]
pods.yml

    kind: Pod
    apiVersion: v1
    metadata:
     name: my-first-pod
    spec:
     containers:
     - name: my-first-container
       image: my-first-image:3.0.0
index.js

    var http = require('http');
    var server = http.createServer(function(request, response) {
     response.statusCode = 200;
     response.setHeader('Content-Type', 'text/plain');
     response.end('Welcome to the Golden Guide to Kubernetes
    Application Development!');
    });
    server.listen(3000, function() {
     console.log('Server running on port 3000');
    });
crcmnpdw

crcmnpdw1#

原因

这是因为它无法下载你的pod定义文件中定义的docker镜像。默认情况下,它会从DockerHub下载所需的镜像。

方式一

因此,在创建my-first-image:3.0.0镜像后,您必须在DockerHub上发布它。为此,在DockerHub上创建帐户并使用login命令从终端登录

sudo docker login

字符串
登录成功后,使用标签中的DockerHub用户名重建Docker镜像,并推送到DockerHub(more details

sudo docker image build -t YOUR_DOCKERHUB_USERNAME/my-first-image:3.0.0 .
sudo docker push YOUR_DOCKERHUB_USERNAME/my-first-image:3.0.0


pod.yml中的映像更新为YOUR_DOCKERHUB_USERNAME/my-first-image:3.0.0,并像以前一样创建pod。

方式二

您可以指示从本地机器中找到所需的Docker镜像,而不是从DockerHub下载。为此,您必须在特定容器描述下的pod.yml文件中添加imagePullPolicy: Never。下面是pod.yml文件的示例,以显示在何处定义镜像拉取策略

kind: Pod
apiVersion: v1
metadata:
 name: my-first-pod
spec:
 containers:
 - name: my-first-container
   image: YOUR_DOCKERHUB_USERNAME/my-first-image:3.0.0
   imagePullPolicy: Never

4urapxun

4urapxun2#

由于您正在使用一个图像而没有上传它。您必须将imagePullPolicy设置为Never,否则Kubernetes将尝试下载图像。

启动minikube

minikube start

设置docker env

eval $(minikube docker-env)

构建镜像

docker build -t my-first-image:3.0.0 .

在minikube中运行

kubectl run my-first-container --image=my-first-image:3.0.0 --image-pull-policy=Never

检查它是否正在运行

kubectl get pods
您的pod规格应该如下所示
pods.yml

kind: Pod
apiVersion: v1
metadata:
 name: my-first-pod
spec:
 containers:
 - name: my-first-container
   image: my-first-image:3.0.0
   imagePullPolicy: Never

字符串

nafvub8i

nafvub8i3#

你已经构建了镜像,但你需要推送到docker仓库。
如果你在kubernetes节点上构建docker镜像,它可以工作,但更好的是推送到仓库,这样docker将从中央仓库拉取,随着节点数量的增加,你无法控制pod将在哪里调用,镜像将不可用。

docker push -t my-first-image:3.0.0

字符串
如果你有私有的Docker仓库,请推送到私有仓库并使用完整的镜像名称。

rsl1atfo

rsl1atfo4#

缺少存储库名称。
在dockerHub中创建一个帐户。然后在dockerhub中构建并推送镜像到您的repo中

sudo docker image build -t niranga/my-first-image:3.0.0 .
sudo docker login
sudo docker push niranga/my-first-image:3.0.0

字符串
更新pod.yaml文件中的镜像名为niranga/my-first-image:3.0.0
它应该工作

to94eoyn

to94eoyn5#

当你构建镜像到本地Minikube注册表时,你可能想设置imagePullPolicy: Never,这样它就不会尝试从远程注册表中拉取镜像。pod规范看起来像这样:

kind: Pod
apiVersion: v1
metadata:
 name: my-first-pod
spec:
 containers:
 - name: my-first-container
   image: my-first-image:3.0.0
   imagePullPolicy: Never

字符串

anauzrmj

anauzrmj6#

如果你使用KiND,还有一个额外的步骤。我已经从这里得到了答案:https://iximiuz.com/en/posts/kubernetes-kind-load-docker-image/
基本上,你必须使用:kind load docker-image image_name:latest添加它,然后确保你将imagePullPolicy: Never添加到yaml中,就像前面的答案提到的那样。另外,确保在yaml中标记你的图像的特定版本,例如image: image_name:latest

相关问题