run - ¿Cómo defino el nombre de la imagen construida con docker-compose?
docker run image (5)
Estoy usando docker-compose para crear mi entorno de desarrollo. Quiero construir una imagen específica, pero no sé cómo establecer un nombre para esa imagen.
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
Cuando ejecuto
docker-compose
todo está bien, pero obtengo un nombre aleatorio para la nueva imagen.
¿Es posible establecer un nombre para la imagen de compilación?
Opción 1: Sugerencia de nombre de imagen predeterminado
El nombre de la imagen generada por
docker-compose
depende del nombre de la carpeta de forma predeterminada, pero puede anularlo usando el argumento
--project-name
:
$ docker-compose --project-name foo build bar
$ docker images foo_bar
Opción 2: especificar el nombre de la imagen
Una vez que
Docker-compose 1.6.0
está fuera, puede especificar
build:
e
image:
para tener un nombre de imagen explícito (consulte
la respuesta de arulraj.net
).
Opción 3: crear imagen desde el contenedor
Un tercero es crear una imagen desde el contenedor:
$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar
Dependiendo de su caso de uso, puede usar una imagen que ya ha sido creada y especificar su nombre en
docker-compose
.
Tenemos un caso de uso de producción en el que nuestro servidor CI crea una imagen Docker con nombre.
(
docker build -t <specific_image_name> .
).
Una vez que se especifica la imagen nombrada, nuestro
docker-compose
siempre se basa en la imagen específica.
Esto permite un par de posibilidades diferentes:
1- Puedes asegurarte de que desde donde
docker-compose
tu
docker-compose
, siempre usarás la última versión de esa imagen específica.
2- Puede especificar varias imágenes con nombre en su archivo
docker-compose
y dejar que se cableen automáticamente a través del paso de compilación anterior.
Entonces, si su imagen ya está construida, puede nombrarla con
docker-compose
.
Eliminar
build
y especificar
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
Después de construir su imagen, haga lo siguiente:
docker tag <image id> mynewtag:version
después de eso, verá que su imagen ya no se llama
<none>
cuando vaya a las
docker images
.
Para el formato de archivo docker-compose versión 2, puede compilar y etiquetar una imagen para un servicio y luego usar esa misma imagen compilada para otro servicio.
Para mi caso, quiero configurar un clúster de búsqueda elástico con 2 nodos, ambos necesitan usar la misma imagen, pero configurados para ejecutarse de manera diferente. También quiero construir mi propia imagen de búsqueda elástica personalizada desde mi propio Dockerfile. Entonces esto es lo que hice (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
Puede ver que en la primera definición de servicio "es-master", uso la opción "compilar" para compilar una imagen desde el Dockerfile en ./elasticsearch. Etiqueto la imagen con el nombre "porter / elasticsearch" con la opción "image". Luego hago referencia a esta imagen construida en la definición del servicio "es-node" con la opción "imagen", y también uso un "dependen_on" para asegurarme de que el otro contenedor "es-master" esté construido y ejecutado primero.
Según docker-compose 1.6.0 :
Ahora puede especificar una clave de compilación y una imagen si está utilizando el nuevo formato de archivo.
docker-compose build
construirá la imagen y la etiquetará con el nombre que ha especificado, mientras quedocker-compose pull
intentará extraerla.
Entonces su
docker-compose.yml
sería
version: ''2''
services:
wildfly:
build: /path/to/dir/Dockerfile
image: wildfly_server
ports:
- 9990:9990
- 80:8080
Para actualizar docker-compose
sudo pip install -U docker-compose==1.6.0