我遇到了Skaffold,试图简化本地Docker镜像开发。我们基本上希望能够快速迭代图像并使用现有的稳定头盔图版本进行部署。
在文档中说:
https://github.com/GoogleContainerTools/skaffold#installation
- Docker镜像注册表。 您的docker客户端应配置为推送到外部docker 图像存储库。如果您正在使用minikube或Docker for Desktop 群集,您可以跳过此要求。
醇>
但是,当我尝试运行示例examples/helm-deployment
时,它实际上会尝试连接到注册表:
$ skaffold dev
...
The push refers to repository [docker.io/library/skaffold-helm]
b3fb485368bf: Preparing
6f67560e4591: Preparing
d626a8ad97a1: Preparing
WARN[0012] run: build: build step: running push: denied: requested access to the resource is denied
我是否总是需要注册表,即使使用Minikube和Skaffold?
答案 0 :(得分:5)
使用skaffold,如果要部署到minikube,则不需要任何注册表。默认情况下,它seamlessly puts将图像迷你化,不涉及任何外部注册表。
考虑以下deployment.yaml
文件:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: petstore-frontend
labels:
app: petstore
tier: frontend
spec:
replicas: 1
selector:
matchLabels:
app: petstore
tier: frontend
template:
metadata:
labels:
app: foo
tier: frontend
spec:
containers:
- name: frontend
image: petstore/frontend
imagePullPolicy: Always
ports:
- containerPort: 80
请注意,image
字段不包含任何标签,因为skaffold会为您注入一个标签。
最小的skaffold.yaml
文件如下所示:
apiVersion: skaffold/v1alpha2
kind: Config
profiles:
- name: minikube
build:
artifacts:
- imageName: petstore/frontend
deploy:
manifests:
- deployment.yaml
在这里,imageName
应该与image
文件中的deployment.yaml
字段值匹配。
现在,您只需运行skaffold run -p minikube
,它将构建您的映像,将其放入minikube并应用部署。
但是,在通过Helm图表进行部署时,您还需要指定一些小而重要的内容。
考虑以下deployment.yaml
模板(为简洁起见,我省略了一些字段):
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: {{ template "petstore-frontend.fullname" . }}
labels:
# <labels>
spec:
replicas: 1
selector:
matchLabels:
# <labels>
template:
metadata:
labels:
# <labels>
spec:
containers:
- name: {{ template "petstore-frontend.name" . }}
image: {{ .Values.image.repository }}{{ if .Values.image.tag }}:{{ .Values.image.tag }}{{ end }}
imagePullPolicy: Always
ports:
- containerPort: 80
重要的是,可以指定不带任何标签的图像,以便skaffold可以为您注入图像。
然后一个skaffold.yaml
文件看起来像这样:
apiVersion: skaffold/v1alpha2
kind: Config
profiles:
- name: minikube
build:
artifacts:
- imageName: petstore/frontend
deploy:
helm:
releases:
- name: petstore-frontend
chartPath: charts/petstore-frontend
values:
"image.repository": petstore/frontend
setValues:
"image.tag": ""
在这里,image.repository
应该与imageName
部分中的artifacts
完全相同,并且image.tag
也被设置为空字符串,如上所述。 skaffold注入它。
总而言之,值得一提的是skaffold仍处于alpha状态,因此API可能会发生变化,也许不再需要“技巧”。尽管如此,skaffold已经为快速的应用程序开发和部署提供了很多便利。
我希望这会有所帮助。
答案 1 :(得分:4)
不,您不需要外部注册表。
使用以下命令,您应该能够在主机mac / linux机器上使用docker与minikube VM内的docker守护程序通信:
eval $(minikube docker-env)
当docker build