Wie setze ich den Bildnamen in Dockerfile?

299

Sie können den Bildnamen beim Erstellen eines benutzerdefinierten Bilds wie folgt festlegen:

docker build -t dude/man:v2 . # Will be named dude/man:v2

Gibt es eine Möglichkeit, den Namen des Bildes in Dockerfile zu definieren, sodass ich ihn im docker buildBefehl nicht erwähnen muss ?

gvlasov
quelle
1
Für alle Neugierigen, die Verwendung von FROM ... AS Name funktioniert NICHT
Rufus

Antworten:

267

Das Markieren des Bildes wird in der Docker-Datei nicht unterstützt. Dies muss in Ihrem Build-Befehl erfolgen. Um dieses Problem zu umgehen, können Sie den Build mit einer docker-compose.yml ausführen, die den Namen des Zielbilds identifiziert, und dann a ausführen docker-compose build. Ein Beispiel für docker-compose.yml würde aussehen

version: '2'

services:
  man:
    build: .
    image: dude/man:v2

Das heißt, es gibt einen Push gegen das Erstellen mit Compose, da dies bei Bereitstellungen im Schwarmmodus nicht funktioniert. Sie können den Befehl also wieder ausführen, wie Sie in Ihrer Frage angegeben haben:

docker build -t dude/man:v2 .

Persönlich neige ich dazu, mit einem kleinen Shell-Skript in meinem Ordner (build.sh) zu erstellen, das alle Argumente übergibt und dort den Namen des Bildes enthält, um die Eingabe zu speichern. Für die Produktion wird der Build von einem ci / cd-Server verwaltet, dessen Image-Name im Pipeline-Skript enthalten ist.

BMitch
quelle
303

So erstellen Sie ein Bild mit einem benutzerdefinierten Namen ohne Verwendung einer XML-Datei:

docker build -t image_name .

So führen Sie einen Container mit einem benutzerdefinierten Namen aus:

docker run -d --name container_name image_name
salehinejad
quelle
78
Ich werde nicht weiter kommentieren, aber die Frage war "Wie man den Bildnamen in Dockerfile festlegt?" Nicht "Wie setze ich den Docker-Image-Namen?" Diese Antwort war in der Frage selbst.
Novaterata
68
Ich bin ein paar Mal darauf zurückgekommen, und diese Antwort hat geholfen, obwohl sie technisch nicht zum Thema gehört
gdbj
7
Wenn Sie konsistent sind, wenn Sie das DockerfileVerzeichnis in ein Verzeichnis mit demselben Namen wie für Ihr Image einfügen, können Sie es docker build -t $(basename $PWD) .als Build-Befehl verwenden. Dann können Sie die STRG-R-Suche von "Build" verwenden, um den Befehl zu finden und wiederzuverwenden, ohne ihn bearbeiten zu müssen. Sie können es auch zu einem Alias ​​machen, wenn Sie möchten.
Bruno Bronosky
Trotzdem vielen Dank für diese Antwort. Ich habe ein paar Stunden damit verbracht, dies über das Internet zu erreichen. Ich konnte keine richtige Antwort bekommen, einer, der seinem Bild einen Namen gibt, kann ohne diesen nicht weiter gehen, wenn er auch einen Namen für seinen Container benötigt.
Susaj S Nair
38

Hier ist eine andere Version, wenn Sie auf eine bestimmte Docker-Datei verweisen müssen:

version: "3"
services:
  nginx:
    container_name: nginx
    build:
      context: ../..
      dockerfile: ./docker/nginx/Dockerfile
    image: my_nginx:latest

Dann rennst du einfach

docker-compose build
David Dehghan
quelle
1
Mir gefällt, dass diese Antwort den Unterschied zwischen dem Containernamen und dem Bildnamen zeigt: tag. Wenn es nur ein bisschen mehr Erklärung dafür gäbe, was los ist: "container_name" benennt den Container, der letztendlich aus dem Bild herausgeschleudert wird. "Bild" benennt und markiert das erstellte Bild, aus dem der Container erstellt wird. Wie andere bereits erwähnt haben, kann der Bildname nicht aus der Docker-Datei angegeben werden, wie vom OP gefordert. Daher verwenden wir stattdessen die Datei docker-compose.yml und führen sie mit "docker-compose up -d --build"
Sean McCarthy aus
-7

Sie können dies mit 'AS' FROM ubuntu: 16.04 AS FooImage tun

Richard
quelle
6
Die ASSyntax gibt den Zielnamen an, der in einem mehrstufigen Build verwendet wird. Dieser Name kann auch anstelle eines Abbilds für die COPY --fromSyntax in diesem mehrstufigen Build verwendet werden. Der resultierende Name / Tag für den Build selbst wird jedoch nicht angegeben.
BMitch