Schieben Sie das Docker-Image in das Amazon Ecs-Repository

76

Ich bin neu bei AWS. Ich möchte ein privates Docker-Repository auf einer AWS ECS-Containerinstanz einrichten. Ich habe ein Repository mit dem Namen erstellt name. Die von AWS angezeigten Beispiel-Push-Befehle funktionieren.

aws ecr get-login --region us-west-2 
docker build -t name .
docker tag name:latest ############.dkr.ecr.us-west-2.amazonaws.com/name:latest 
docker push ############.dkr.ecr.us-west-2.amazonaws.com/name:latest

Aber mit diesen Befehlen habe ich ein Bild mit dem Namen erstellt und gepusht nameund ich möchte ein Bild mit dem Namen erstellen foo. Also habe ich die Befehle geändert in:

docker build -t foo .
docker tag foo ###########.dkr.ecr.us-west-2.amazonaws.com/name/foo
docker push ###########.dkr.ecr.us-west-2.amazonaws.com/name/foo

Das sollte funktionieren, tut es aber nicht. Nach einigen Wiederholungsversuchen erhalte ich den Fehler:

The push refers to a repository [###########.dkr.ecr.us-west-2.amazonaws.com/name/foo]
8cc63cf4528f: Retrying in 1 second
...
name unknown: The repository with name 'name/foo' does not exist in the registry with id '############'

Benötigt AWS wirklich ein dediziertes Repository für jedes Image, das ich pushen möchte?

Oh man
quelle

Antworten:

80

Für die EC2-Containerregistrierung muss für jedes Image "Name" oder "Namespace / Name", das Sie in der Registrierung veröffentlichen möchten, ein Image-Repository eingerichtet werden.

Sie können jedoch jedes :tagsgewünschte Repository in jedem Repository veröffentlichen (das Standardlimit beträgt 100 Tags).

Ich habe in der AWS-Dokumentation nirgendwo etwas gesehen, in dem speziell die Zuordnung von Repository -> Bildnamen angegeben ist, dies wird jedoch durch Erstellen eines Repositorys - Abschnitt 6d im ECR-Benutzerhandbuch impliziert

Die Docker Image-Spezifikation enthält die Definition eines Repositorys

Repository

Eine Sammlung von Tags, die unter einem gemeinsamen Präfix (der vorherigen Namenskomponente :) gruppiert sind . In einem mit dem Namen gekennzeichneten Bild my-app:3.1.4ist my-app beispielsweise die Repository-Komponente des Namens. Ein Repository-Name besteht aus durch Schrägstriche getrennten Namenskomponenten, denen optional ein DNS-Hostname vorangestellt ist. Der Hostname muss den Standard-DNS-Regeln entsprechen, darf jedoch keine _Zeichen enthalten . Wenn ein Hostname vorhanden ist, kann optional eine Portnummer im Format folgen :8080. Namenskomponenten können Kleinbuchstaben, Ziffern und Trennzeichen enthalten. Ein Trennzeichen ist definiert als ein Punkt, ein oder zwei Unterstriche oder ein oder mehrere Striche. Eine Namenskomponente darf nicht mit einem Trennzeichen beginnen oder enden.

Matt
quelle
6
Gibt es eine Dokumentation, in der explizit ein Bild pro Registrierung angegeben ist?
HHC
Ja, entschuldigen Sie, ich meinte einen Bildnamen pro Repository.
HHC
4
ah .. Ich glaube nicht, dass AWS ausdrücklich angibt, dass sich das ECR-Repository-Konzept auf ein einzelnes Docker-Image bezieht nameoder namespace/name. Das erste Mal brauchte ich ein paar Versuche, um es herauszufinden. Abschnitt 6d auf docs.aws.amazon.com/AmazonECR/latest/userguide/… impliziert die Einrichtung eines Repositorys für einen Namen / mehrere Tags mit einem Image-Build-Tag vonrepository:latest
Matt
5
@ Matt Ich wünschte, sie (aws) würden dies festnageln und das zu einer harten Tatsache machen. Ich mag keine losen Interpretationen, da ihr Dokument geschrieben ist.
Kuberchaun
1
Ersetzt ist ein starker Begriff, in den sich Docker-Marketing einkaufen möchte. Hub geht nirgendwo hin und kann sogar die Quelle für ein "kostenloses" Store-Image sein.
Matt
43

Sie müssen für jeden Bildnamen ein Repository erstellen, der Bildname kann jedoch die Form "mycompanyname / helloworld" haben. So erstellen Sie mycompanyname/app1, mycompanyname/app2usw.

aws ecr create-repository --repository-name mycompanyname/helloworld
aws ecr create-repository --repository-name mycompanyname/app1
aws ecr create-repository --repository-name mycompanyname/app2
docker tag helloworld:latest xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/mycompanyname/helloworld:latest
docker push xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/mycompanyname/helloworld:latest
docker tag app1:latest xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/mycompanyname/app1:latest
docker push xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/mycompanyname/app1:latest
RubenLaguna
quelle
1
Das hat funktioniert, übrigens muss ACR nicht zuerst manuell einen Repräsentanten erstellen.
Tilo
auch das scheint, dass Bild geschoben werden muss, wenn andere "sub rep"
Tilo
0

Zusätzlich zu der obigen Antwort bin ich heute hier gestoßen, da sich der Anmeldebefehl mit ändert aws-cli v2. Das Posten als Antwort könnte anderen helfen. als aws-cli v1Anmeldebefehl funktioniert nicht mehr.

V1
$(aws ecr get-login --no-include-email)

Um das Bild mit aws-cli v2 an ECR zu senden, benötigen Sie

aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 123456789.dkr.ecr.us-west-2.amazonaws.com

Dann können Sie bauen und pushen

docker build -t myrepo .
docker tag myrepo:latest 123456789.dkr.ecr.us-west-2.amazonaws.com/myrepo
docker push 123456789.dkr.ecr.us-west-2.amazonaws.com/myrepot

In der Regel ist ein Image pro Registrierung ein sauberer Ansatz. Aus diesem Grund erhöht AWS das Image pro Repository und Repository pro Region von 1000 auf 10.000.

Adiii
quelle
0

Ich habe die folgenden Schritte ausprobiert und bestätigt, für mich zu arbeiten:

  1. aws ecr get-login-password --region us-west-2 | Docker-Login - Benutzername AWS --password-stdin xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com

  2. aws ecr create-repository - Test des Repository-Namens

  3. Docker Build-t Test.

  4. Docker-Tag-Test: Neueste xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/test:latest

  5. Docker Push xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/test:latest

Steven Shi
quelle
-5

Sie müssen kein Repo pro Bild erstellen, sondern müssen die Namen neu strukturieren:

docker build -t foo .
docker tag foo ####.dkr.ecr.us-west-2.amazonaws.com/name:foo_v0.23.1
docker push ####.dkr.ecr.us-west-2.amazonaws.com/name:foo_v0.23.1
AAber
quelle
Ja, aber die Verwendung von Tags zur Unterscheidung Ihrer Bilder ist eine beschissene Art, Dinge zu tun.
Dwjohnston
Schreckliche Lösung, Tags sind, wie wir Bilder
versionieren
Wie aus den obigen Kommentaren hervorgeht, handelt es sich hierbei um ein Anti-Muster. Eine, die sich bei Verwendung in größeren Entwicklungsteams leicht als fehleranfällig erweisen könnte. Es wäre besser, eine Lösung zu schreiben. So etwas wie: gist.github.com/jmervine/b1835fa3bfcea9eaa9bf2521291f0615
jmervine
3
@jmervine "besser dran", nicht "besser dran".
Acumenus
Dies scheint für einige Szenarien durchaus sinnvoll zu sein. Beispielsweise verwenden viele beliebte Docker-Repositorys diese Methode, um zwischen "Geschmacksrichtungen" eines Bildes zu unterscheiden, z. B. nginx:alpinevsnginx:perl
jchook