如何在Windows 10上拉本地构建的Docker映像?

时间:2020-02-24 02:56:04

标签: docker kubernetes minikube

我的操作系统是Windows 10专业版,我使用Spring Boot开发。首先,我在Dockerfile下面构建docker镜像。

FROM openjdk:11-jdk
ADD target/Spring-Blog-Jpa-0.0.1-SNAPSHOT.jar blog-app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Dfile.encoding=UTF8","-jar","blog-app.jar"]

使用docker命令成功构建了docker映像。

> docker image build -t blog-app:latest .

然后我从docker仓库中提取了mysql:latest镜像。 mysql拉取也成功。

> docker image pull mysql:latest .

我尝试使用这些docker镜像生成kubernetes pod。如果是mysql:latest映像,则生成的mysql pod没有错误。但是,在生成Blog-app Pod时,无法提取blog-app:latest图像,并引发错误消息。以下是配置yaml文件。

apiVersion: apps/v1
kind: Pod
metadata:
  name: blog-system
spec:
  containers:
  - name: blog-app
    image: blog-app:latest
    args: ["-t", "-i"]

我不知道为什么在生成Pod时为什么无法提取本地生成的图像。是否有任何推送本地docker存储库的过程?如何在Kuberetes上提取本地构建的docker映像?

2 个答案:

答案 0 :(得分:2)

您可以重用Minikube的Docker守护程序。这是Powershell上的命令。

PS C:\ minikube> minikube docker-env

PS C:\ minikube> minikube docker-env |调用表达

docker image build -t blog-app:latest

在pod规格中将图像设置为build标签

将imagePullPolicy设置为“从不”,否则Kubernetes将尝试下载图像。


apiVersion: apps/v1
kind: Pod
metadata:
  name: blog-system
spec:
  containers:
  - name: blog-app
    image: blog-app:latest
    imagePullPolicy: Never
    args: ["-t", "-i"]

还要检查此guide

答案 1 :(得分:1)

这是Docker令人困惑的方面。本质上,Kubernetes试图从容器注册表中拉出图像,并且(通常)直到将图像推入注册表中,才能将其拉出。

docker [push|pull] ...时,您正在与(远程)容器注册表进行交互。默认情况下(如果未指定),您正在与DockerHub交互,并且可能假定图像(除非另行标记)以DockerHub的https://docker.io为前缀。如果您使用,例如Google Container Registry,您将更频繁地使用其主机前缀,例如https://gcr.io

在主机上构建容器时,直到docker push ...映像都不在注册表中。

当您在Kubernetes规范| config中引用映像时,Kubernetes希望从注册表中提取该映像。就您而言,blob-app不在注册表中,因此失败。

您可以运行本地注册表来解决此问题。一种执行此操作的方法是每个@ arghya-sadhu答案使用Minikube。但是您也可以运行Docker自己的注册表规范实现的Docker映像,请参见registry

或者您可以将图像推送到可公开访问的注册表,例如DockerHubGoogle Container RegistryQuay,然后像使用mysql一样从注册表中引用映像。 DockerHub具有一个非常常用的免费层,并允许公共和(数量有限的)私人存储库。