我的操作系统是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映像?
答案 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。
或者您可以将图像推送到可公开访问的注册表,例如DockerHub,Google Container Registry,Quay,然后像使用mysql
一样从注册表中引用映像。 DockerHub具有一个非常常用的免费层,并允许公共和(数量有限的)私人存储库。