Ich verwende Docker für Mac 18.05.0-ce-mac66 (24545) (Edge) mit Kubernetes-Unterstützung, und ich kämpfe mit dem Erstellen einer kubernetes-Bereitstellung, die auf ein lokal erstelltes Image verweist.
Ausgabe von docker images
:
REPOSITORY TAG IMAGE
test latest 2c3bdb36a5ed
Meine Bereitstellung.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld-deployment
spec:
selector:
matchLabels:
app: helloworld
replicas: 1
template:
metadata:
labels:
app: helloworld
spec:
containers:
- name: aaa
image: test:latest
ports:
- containerPort: 8080
Wenn ich kubectl apply -f deplyment.yaml
laufen lasse, werden folgende erstellt:
helloworld-deployment-764b8b85d8-2c4kl 0/1 ImagePullBackOff 0
helloworld-deployment-764b8b85d8-rzq7l 0/1 ImagePullBackOff 0
Beschreiben Sie einen dieser Pods mit:
Normal Scheduled 20s default-scheduler Successfully assigned helloworld-deployment-79f66d97c6-7tj2x to docker-for-desktop
Normal SuccessfulMountVolume 19s kubelet, docker-for-desktop MountVolume.SetUp succeeded for volume "default-token-72f44"
Normal BackOff 16s kubelet, docker-for-desktop Back-off pulling image "test:latest"
Warning Failed 16s kubelet, docker-for-desktop Error: ImagePullBackOff
Normal Pulling 4s (x2 over 19s) kubelet, docker-for-desktop pulling image "test:latest"
Warning Failed 2s (x2 over 17s) kubelet, docker-for-desktop Failed to pull image "test:latest": rpc error: code = Unknown desc = Error response from daemon: pull access denied for test, repository does not exist or may require 'docker login'
Warning Failed 2s (x2 over 17s) kubelet, docker-for-desktop Error: ErrImagePull
Interessant ist, dass, wenn ich versuche, ein auf dockerhub gehostetes Image auszuführen, alles in Ordnung ist. Ich habe auch versucht, skaffold zu verwenden, und es funktioniert auch als Charme ...
Ich sehe einige ähnliche Probleme in Bezug auf Minikube, bei denen die Lösung darin besteht, Minikube Docker-Deamon für erstellte Bilder zu verwenden, damit sie vom kubernetes-Cluster referenziert werden können. Ich möchte die Einrichtung eines lokalen Repos vermeiden, aber wie kann ich es mit Docker Edge Kubernetes funktionieren lassen?
Ich konnte ein lokales Image ausführen, indem Sie imagePullPolicy
auf Never
setzen.
Zum Beispiel:
apiVersion: v1
kind: Pod
metadata:
name: local-image-test
spec:
containers:
- name: local-image-container
image: local-image:latest
imagePullPolicy: Never
(Kredit an https://github.com/kubernetes/kubernetes/issues/1293#issuecomment-357326426 für diese Lösung)
Verwenden Sie die Tag-Version des Images anstelle der neuesten Version, da Sie Docker-Images an eine Produktionsumgebung versenden, wenn Sie das neueste Tag einfach ignorieren. Verwenden Sie es nicht. Lass dich nicht in Versuchung führen. Es ist einfach, sich das anzuschauen und zu denken, dass Ihr Implementierungsskript nur die neuesten Informationen abrufen sollte, und Ihr Erstellungsprozess stellt sicher, dass diese Gültigkeit gültig ist.
Zusätzlich zu techtrainer comment und answer. Möchte ich einige Beispiele dafür geben.
Allgemeine Regel. Sie müssen die Tag-Version von Bildern anstelle von latest
..__ verwenden. Bei Docker-Tags gilt: Je genauer Sie werden, desto besser. Achten Sie darauf, dass das falsche Bild nicht verwendet wird. Berücksichtigen Sie dies, wenn Sie nicht möchten, dass Ihre Kollegen oder andere Docker-Benutzer Bilder herunterziehen und keine Ahnung haben, wie aktuell sie sind.
docker tag IMAGE ID image/TAG:version.d.m.y
Für eine bessere Verwaltung Ihrer Bilder sollten Sie einige kluge Konventionen für die Benennung verwenden. Ich benutze lieber eine Stufe, Version und ein Erstellungsdatum des Bildes. Zum Beispiel:
docker tag 113a43faa138 ubuntu/prod:v1.8.6.2018
Es ist die Produktionsphase, Version 1, die am 8. Juni 2018 erstellt wurde.
Und das ist alles. Ihre Version ist verfügbar und die Benennung ist für Sie und Weitere Benutzer dieses Bildes einfacher zu verstehen.