Comment définir le nom de l'image créée avec docker-compose

203

J'utilise docker-compose pour créer mon environnement de développement. Je veux créer une image spécifique, mais je ne sais pas comment définir un nom pour cette image.

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

Quand j'exécute docker-composetout va bien, mais j'obtiens un nom aléatoire pour la nouvelle image. Est-il possible de donner un nom à l'image de construction?

Robert
la source
18
Si vous utilisez docker-compose pour créer l'image, le nom de l'image sera toujours <project>_<service>, où <service>dans cet exemple est wildflyet le projet par défaut le nom du répertoire dans lequel vous vous trouvez. Vous pouvez changer cela avec -pou COMPOSE_PROJECT_NAMEvariable d'environnement. Il n'y a aucun moyen de définir un nom d'image personnalisé.
dnephin
1
n'y a-t-il pas de réponses acceptables?
AmanicA
docs.docker.com/docker-cloud/apps/service-links - document officiel à ce sujet
Ivan Aracki
2
vous pouvez également définir COMPOSE_PROJECT_NAME=xdans .envvos conteneurs seront appelés{x}_{service}_{#}
eMPee584

Réponses:

181

Pour le format de fichier Docker-compose version 2, vous pouvez créer et baliser une image pour un service, puis utiliser cette même image construite pour un autre service.

Pour mon cas, je veux mettre en place un cluster de recherche élastique avec 2 nœuds, ils ont tous deux besoin d'utiliser la même image, mais configuré pour fonctionner différemment. Je veux également créer ma propre image elasticsearch personnalisée à partir de mon propre Dockerfile. Voici donc ce que j'ai fait (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

Vous pouvez voir que dans la première définition de service "es-master", j'utilise l'option "build" pour construire une image à partir du Dockerfile dans ./elasticsearch. Je marque l'image avec le nom "porter / elasticsearch" avec l'option "image". Je référence ensuite cette image construite dans la définition de service "es-node" avec l'option "image", et j'utilise également un "depend_on" pour m'assurer que l'autre conteneur "es-master" est construit et exécuté en premier.

Jason White
la source
56
L'option a container_name:vraiment aidé.
Bruno Bieri
2
Êtes-vous sûr que cela fonctionne? buildet images'excluent mutuellement. J'obtiens "Le service xxx a à la fois une image et un chemin de génération spécifiés. Un service peut être construit pour l'image ou utiliser une image existante, pas les deux."
Burhan Ali
3
Oh peu importe. Ces deux peuvent être utilisés ensemble au format v2 et au-delà. La chose que je testais ne spécifiait pas de version, donc je suppose que c'était la v1.
Burhan Ali
3
L'option container_name: m'a vraiment aidé thks
lanni654321
2
@BrunoBieri depends_onutilise le nom du service dans le doker-composefichier, pas besoin de spécifier un nom de conteneur. Même l'exemple le montre depends_on: es-masteret nondepends_on: es_master
blueFast
65

Selon docker-compose 1.6.0 :

Vous pouvez maintenant spécifier à la fois une génération et une clé d'image si vous utilisez le nouveau format de fichier. docker-compose buildcréera l'image et la marquera avec le nom que vous avez spécifié, tandis que docker-compose pulltentera de la tirer.

Donc tu docker-compose.ymlserais

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

Pour mettre à jour docker-compose

sudo pip install -U docker-compose==1.6.0
arulraj.net
la source
1
ERREUR: La validation a échoué, raison (s): cornsoup a à la fois une image et un chemin de génération spécifiés. Un service peut être construit pour l'image ou utiliser une image existante, pas les deux. (docker-compose 1.6.2)
zx1986
@ zx1986 pour cela vous devez utiliser la nouvelle version du fichier docker-compose.yml référez-vous à ce docs.docker.com/compose/compose-file/#upgrading Sur la base de cette mise à jour de ma réponse
arulraj.net
50

Option 1: indication du nom d'image par défaut

Le nom de l'image générée par docker-compose dépend du nom du dossier par défaut mais vous pouvez le remplacer en utilisant l' --project-nameargument:

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

Option 2: spécification du nom de l'image

Une fois que docker-compose 1.6.0 est sorti, vous pouvez spécifier build:et image:avoir un nom d'image explicite (voir la réponse de arulraj.net ).

Option 3: créer une image à partir du conteneur

Une troisième consiste à créer une image à partir du conteneur:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar
Wernight
la source
1
--project-namene semble plus être accepté. Utilisation de 1.23.2
Steven Vachon
21

Selon votre cas d'utilisation, vous pouvez utiliser une image déjà créée et spécifier son nom dans docker-compose.

Nous avons un cas d'utilisation de production où notre serveur CI construit une image Docker nommée. ( docker build -t <specific_image_name> .). Une fois que l'image nommée est spécifiée, notre docker-composes'appuie toujours sur l'image spécifique. Cela permet plusieurs possibilités:

1- Vous pouvez vous assurer que partout où vous exécutez votre docker-compose, vous utiliserez toujours la dernière version de cette image spécifique.

2- Vous pouvez spécifier plusieurs images nommées dans votre docker-composefichier et les laisser être câblées automatiquement à l'étape de construction précédente.

Donc, si votre image est déjà construite, vous pouvez nommer l'image avec docker-compose. Supprimer buildet spécifierimage:

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-
la source
10

après avoir créé votre image, procédez comme suit:

docker tag <image id> mynewtag:version

après cela, vous verrez que votre image n'est plus nommée <none>lorsque vous allez docker images.

GHETTO.CHiLD
la source
3
Est-il possible de spécifier les balises avec docker-compose?
Robert
les balises ne semblent pas être prises en charge pour le moment.
GHETTO.CHiLD
1
Je dois donc créer l'image et la ré-étiqueter plus tard? N'est-ce pas vraiment utile, j'espère que le docker-compose résout ce problème rapidement?
Robert
1
si vous créez un environnement multi-conteneurs, oui. si vous docker build -t mytag:version .
créez