Wie definiere ich den Namen des mit Docker-Compose erstellten Bildes?

201

Ich verwende Docker-Compose , um meine Entwicklungsumgebung zu erstellen. Ich möchte ein bestimmtes Bild erstellen, weiß aber nicht, wie ich einen Namen für dieses Bild festlegen soll.

wildfly:
  build: /path/to/dir/Dockerfile
  container_name: wildfly_server
  ports:
   - 9990:9990
   - 80:8080
  environment:
   - MYSQL_HOST=mysql_server
   - MONGO_HOST=mongo_server
   - ELASTIC_HOST=elasticsearch_server
  volumes:
   - /Volumes/CaseSensitive/development/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/
  links:
   - mysql:mysql_server
   - mongo:mongo_server
   - elasticsearch:elasticsearch_server

Wenn ich etwas ausführe, ist docker-composealles in Ordnung, aber ich bekomme einen zufälligen Namen für das neue Bild. Ist es möglich, dem Build-Image einen Namen zu geben?

Robert
quelle
17
Wenn Sie Docker-Compose verwenden, um das Image zu erstellen, wird der Image-Name immer so sein <project>_<service>, wie <service>in diesem Beispiel, wildflyund das Projekt verwendet standardmäßig den Verzeichnisnamen, in dem Sie sich befinden. Sie können dies mit -poder der COMPOSE_PROJECT_NAMEUmgebungsvariablen ändern . Es gibt keine Möglichkeit, einen benutzerdefinierten Bildnamen festzulegen.
Dnephin
1
Gibt es keine akzeptablen Antworten?
AmanicA
docs.docker.com/docker-cloud/apps/service-links - offizielles Dokument zu diesem Thema
Ivan Aracki
2
Sie können auch festlegen , COMPOSE_PROJECT_NAME=xin .envund Ihre Container genannt werden{x}_{service}_{#}
eMPee584

Antworten:

181

Für das Docker-Compose-Dateiformat der Version 2 können Sie ein Image für einen Dienst erstellen und mit Tags versehen und dann dasselbe erstellte Image für einen anderen Dienst verwenden.

In meinem Fall möchte ich einen elastischen Suchcluster mit zwei Knoten einrichten. Beide müssen dasselbe Image verwenden, sind jedoch so konfiguriert, dass sie unterschiedlich ausgeführt werden. Ich möchte auch mein eigenes benutzerdefiniertes Elasticsearch-Image aus meiner eigenen Docker-Datei erstellen. Das habe ich also gemacht (docker-compose.yml):

version: '2'

services:
  es-master:
    build: ./elasticsearch
    image: porter/elasticsearch
    ports:
      - "9200:9200"
    container_name: es_master

  es-node:
    image: porter/elasticsearch
    depends_on:
      - es-master
    ports:
      - "9200"
    command: elasticsearch --discovery.zen.ping.unicast.hosts=es_master

Sie können sehen, dass ich in der ersten Dienstdefinition "es-master" die Option "build" verwende, um ein Image aus der Docker-Datei in ./elasticsearch zu erstellen. Ich beschrifte das Bild mit dem Namen "porter / elasticsearch" mit der Option "image". Ich verweise dann auf dieses erstellte Image in der "es-node" -Dienstdefinition mit der Option "image" und verwende auch ein "abhängiges_on", um sicherzustellen, dass der andere Container "es-master" zuerst erstellt und ausgeführt wird.

Jason White
quelle
55
Die Option hat container_name:wirklich geholfen.
Bruno Bieri
2
Bist du sicher, dass das funktioniert? buildund schließen imagesich gegenseitig aus. Ich erhalte die Meldung "Dienst xxx hat sowohl ein Image als auch einen Erstellungspfad angegeben. Ein Service kann entweder als Image erstellt werden oder ein vorhandenes Image verwenden, nicht beide."
Burhan Ali
3
Vergiss es. Diese beiden können zusammen im v2-Format und danach verwendet werden. Das, was ich getestet habe, hat keine Version angegeben, daher wurde angenommen, dass es sich um v1 handelt.
Burhan Ali
3
Die Option container_name: hat mir wirklich geholfen thks
lanni654321
2
@BrunoBieri depends_onverwendet den Namen des Dienstes in der doker-composeDatei, ohne dass ein Containername angegeben werden muss. Sogar das Beispiel zeigt es depends_on: es-masterund nichtdepends_on: es_master
blueFast
65

Wie pro Docker-compose 1.6.0 :

Sie können jetzt sowohl einen Build- als auch einen Image-Schlüssel angeben, wenn Sie das neue Dateiformat verwenden. docker-compose builderstellt das Bild und markiert es mit dem von Ihnen angegebenen Namen, während docker-compose pullversucht wird, es abzurufen.

So docker-compose.ymlwäre es auch

version: '2'
services:
  wildfly:
      build: /path/to/dir/Dockerfile
      image: wildfly_server
      ports:
       - 9990:9990
       - 80:8080

Docker-Compose aktualisieren

sudo pip install -U docker-compose==1.6.0
arulraj.net
quelle
1
FEHLER: Validierung fehlgeschlagen, Grund (e): Bei Cornsoup sind sowohl ein Image als auch ein Build-Pfad angegeben. Ein Dienst kann entweder als Image erstellt werden oder ein vorhandenes Image verwenden, nicht beide. (Docker-Compose 1.6.2)
zx1986
@ zx1986 für die Sie eine neue Version von Docker-compose.yml Datei verweisen diese verwenden , haben docs.docker.com/compose/compose-file/#upgrading auf diesem aktualisiert meine Antwort Basierend
arulraj.net
50

Option 1: Hinweis auf den Standardbildnamen

Der Name des von Docker-Compose generierten Bildes hängt standardmäßig vom Ordnernamen ab. Sie können ihn jedoch mithilfe des folgenden --project-nameArguments überschreiben :

$ docker-compose --project-name foo build bar
$ docker images foo_bar

Option 2: Angeben des Bildnamens

Sobald Docker-Compose 1.6.0 veröffentlicht ist, können Sie einen expliziten Bildnamen angeben build:und festlegen image:(siehe Antwort von arulraj.net ).

Option 3: Bild aus Container erstellen

Ein dritter besteht darin, ein Bild aus dem Container zu erstellen:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar
Wernight
quelle
1
--project-namescheint nicht mehr akzeptiert zu werden. Verwenden von 1.23.2
Steven Vachon
21

Abhängig von Ihrem Anwendungsfall können Sie ein bereits erstelltes Bild verwenden und dessen Namen in angeben docker-compose.

Wir haben einen Produktionsanwendungsfall, in dem unser CI-Server ein benanntes Docker-Image erstellt. ( docker build -t <specific_image_name> .). Sobald das benannte Bild angegeben ist, docker-composebaut es immer auf dem spezifischen Bild auf. Dies ermöglicht verschiedene Möglichkeiten:

1- Sie können sicherstellen, dass docker-composeSie immer die neueste Version dieses bestimmten Images verwenden , wo immer Sie Ihr Image ausführen .

2- Sie können mehrere benannte Bilder in Ihrer docker-composeDatei angeben und sie im vorherigen Erstellungsschritt automatisch verkabeln lassen.

Wenn Ihr Image bereits erstellt wurde, können Sie das Image mit benennen docker-compose. Entfernen buildund angebenimage:

wildfly:
  image: my_custom_wildfly_image
  container_name: wildfly_server
  ports:
   - 9990:9990
   - 80:8080
  environment:
   - MYSQL_HOST=mysql_server
   - MONGO_HOST=mongo_server
   - ELASTIC_HOST=elasticsearch_server
  volumes:
   - /Volumes/CaseSensitive/development/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/
  links:
   - mysql:mysql_server
   - mongo:mongo_server
   - elasticsearch:elasticsearch_server
meoww-
quelle
10

Nachdem Sie Ihr Image erstellt haben, gehen Sie wie folgt vor:

docker tag <image id> mynewtag:version

Danach sehen Sie, dass Ihr Bild nicht mehr benannt ist, <none>wenn Sie gehen docker images.

GHETTO.CHiLD
quelle
3
Ist es möglich, die Tags mit Docker-Compose anzugeben?
Robert
Tags scheinen derzeit nicht unterstützt zu werden.
GHETTO.CHiLD
1
Also muss ich das Image erstellen und später neu markieren? Ist das nicht wirklich nützlich, ich hoffe das Docker-Compose behebt dieses Problem schnell?
Robert
1
Wenn Sie eine Umgebung mit mehreren Containern erstellen, ja. Wenn Sie eine docker build -t mytag:version .
Einzelcontainerumgebung erstellen,