398 Stimmen

Wie erstellt man einen benannten und neuesten Tag in Docker?

Angenommen, ich habe ein Bild, das ich als 0.10.24 taggen möchte (in meinem Fall handelt es sich um ein Bild, das Node.js 0.10.24 enthält). Ich habe dieses Bild mit einem Dockerfile erstellt und docker build ausgeführt und einen Tag mit dem Parameter -t angegeben.

Ich erwarte, dass ich eines Tages zusätzliche Versionen dieses Bildes haben werde, also werde ich den Prozess erneut starten, allerdings mit einem anderen Tag-Namen.

Bisher läuft alles gut. Das funktioniert großartig und alles ist in Ordnung.

Aber hier beginnen die Probleme: Ich möchte auch immer das neueste Bild zusätzlich als latest taggen. Also denke ich, dass ich zwei Namen für dasselbe Bild geben muss.

Wie mache ich das? Muss ich wirklich docker build mit exakt derselben Version erneut ausführen, aber diesmal einen anderen Tag verwenden, oder gibt es eine bessere Option?

456voto

Tommy Punkte 6600

Sie können beim Erstellen des Bildes mehrere Tags haben:

$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .

Referenz: https://docs.docker.com/engine/reference/commandline/build/#tag-image-t

221voto

creack Punkte 115860

Sobald Sie Ihr Bild haben, können Sie verwenden

$ docker tag <image> <neuerName>/<repositoriumsname>:<tagname>
  1. Erstellen und taggen Sie das Bild mit creack/node:latest

    $ ID=$(docker build -q -t creack/node .)
  2. Fügen Sie einen neuen Tag hinzu

    $ docker tag $ID creack/node:0.10.24
  3. Sie können dies verwenden und den -t Teil vom Build überspringen

    $ docker tag $ID creack/node:latest

69voto

2Fast2BCn Punkte 912

Hier ist mein Bash-Skript

docker build -t ${IMAGE}:${VERSION} .
docker tag ${IMAGE}:${VERSION} ${IMAGE}:latest

Sie können dann ungetaggte Images entfernen, wenn Sie dieselbe Version neu erstellt haben mit

docker rmi $(docker images | grep "^" | awk "{print $3}")

Link

oder

docker rmi $(docker images | grep "^" | tr -s " " | cut -d' ' -f3 | tr '\n' ' ')

oder

Aufräum-Befehle:

Docker 1.13 führt Aufräum-Befehle ein. Um alle ungenutzten Container, Images, Netzwerke und Volumes zu entfernen:

docker system prune

oder einzeln:

docker container prune
docker image prune
docker network prune
docker volume prune

22voto

Aaron Digulla Punkte 308693

ID=$(docker build -t creack/node .) funktioniert für mich nicht, da ID den Output aus dem Build enthalten wird.

Also benutze ich dieses kleine BASH-Skript:

#!/bin/bash

set -o pipefail

IMAGE=... dein Bildname ...
VERSION=... die Version ...

docker build -t ${IMAGE}:${VERSION} . | tee build.log || exit 1
ID=$(tail -1 build.log | awk '{print $3;}')
docker tag $ID ${IMAGE}:latest

docker images | grep ${IMAGE}

docker run --rm ${IMAGE}:latest /opt/java7/bin/java -version

9voto

Einfach die ID mit grep aus docker images herausfinden:

docker build -t creack/node:latest .
ID="$(docker images | grep 'creak/node' | head -n 1 | awk '{print $3}')"
docker tag "$ID" creack/node:0.10.24
docker tag "$ID" creack/node:latest

Benötigt keine temporäre Datei und liefert vollen Build-Ausgabeprotokoll. Du kannst es immer noch nach /dev/null oder einer Protokolldatei umleiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X