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?
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.
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 quedocker-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
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
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 ).
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
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
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
.