web-dev-qa-db-fra.com

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

J'utilise docker-compose pour créer mon environnement de développement. Je souhaite 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-compose tout va bien, mais j'obtiens un nom aléatoire pour la nouvelle image. Est-il possible de donner un nom à l'image de construction?

161
Robert

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

Dans mon cas, je souhaite configurer un cluster de recherche élastique avec 2 nœuds. Ils doivent tous deux utiliser la même image mais être configurés pour s'exécuter différemment. Je souhaite également créer ma propre image elasticsearch personnalisée à partir de mon propre fichier Dockerfile. Alors voici 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 fichier Dockerfile dans ./elasticsearch. Je marque l'image avec le nom "porter/elasticsearch" avec l'option "image". Je fais ensuite référence à cette image construite dans la définition de service "es-node" avec l'option "image", et j'utilise également un "dépend_on" pour m'assurer que l'autre conteneur "es-master" est construit et exécuté en premier.

138
Jason White

Selon docker-compose 1.6. :

Vous pouvez maintenant spécifier une clé de construction et une clé d’image si vous utilisez le nouveau format de fichier. docker-compose build construira l'image et la taguera avec le nom que vous avez spécifié, tandis que docker-compose pull tentera de l'extraire.

Donc, votre docker-compose.yml serait

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
49
arulraj.net

Option 1: indication du nom de l'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'argument --project-name:

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

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

Une fois docker-compose 1.6.0 épuisé, vous pouvez spécifier build: et image: afin d’avoir un nom d’image explicite (voir réponse de arulraj.net ).

Option 3: Créer une image à partir d'un 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
47
Wernight

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 nommée Docker. (docker build -t <specific_image_name> .). Une fois que l'image nommée est spécifiée, notre docker-compose est toujours construit à partir de l'image spécifique. Cela permet différentes possibilités:

1- Vous pouvez vous assurer que, quel que soit le lieu 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 fichier docker-compose et les laisser être automatiquement câblées à travers l'étape de construction précédente.

Donc, si votre image est déjà construite, vous pouvez la nommer avec docker-compose. Supprimez build et spécifiez image:

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
18
meoww-

après avoir construit 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.

7
GHETTO.CHiLD