¿Cómo defino el nombre de la imagen construida con docker-compose?

203

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-composetodo está bien, pero obtengo un nombre aleatorio para la nueva imagen. ¿Es posible establecer un nombre para la imagen de compilación?

Robert
fuente
17
Si está utilizando estibador de composición de construir la imagen, el nombre de la imagen siempre va a estar <project>_<service>, en donde <service>en este ejemplo es wildflyy valores predeterminados del proyecto al nombre del directorio que se encuentre. Puede cambiar eso con -po COMPOSE_PROJECT_NAMEvariable de entorno. No hay forma de establecer un nombre de imagen personalizado.
dnephin
1
¿no hay respuestas aceptables?
AmanicA
docs.docker.com/docker-cloud/apps/service-links - documento oficial sobre este tema
Ivan Aracki
2
también se puede establecer COMPOSE_PROJECT_NAME=xen .envy sus envases se llamará{x}_{service}_{#}
eMPee584

Respuestas:

181

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 elástica de búsqueda 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 de 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 se ejecute primero.

Jason White
fuente
55
La opción container_name:realmente ayudó.
Bruno Bieri
2
¿Estás seguro de que esto funciona? buildy imageson mutuamente excluyentes. Obtengo "El servicio xxx tiene una imagen y una ruta de compilación especificadas. Un servicio puede crearse en una imagen o utilizar una imagen existente, no ambas".
Burhan Ali
3
Oh no importa. Esos dos se pueden usar juntos en el formato v2 y en adelante. Lo que estaba probando no especificaba una versión, así que supongo que se suponía que era v1.
Burhan Ali
3
La opción container_name: realmente me ayudó gracias
lanni654321
2
@BrunoBieri depends_onusa el nombre del servicio en el doker-composearchivo, no es necesario especificar un nombre de contenedor. Incluso el ejemplo lo muestra depends_on: es-mastery nodepends_on: es_master
blueFast
65

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 buildconstruirá la imagen y la etiquetará con el nombre que ha especificado, mientras docker-compose pullque intentará extraerla.

Entonces tu docker-compose.ymlserí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
arulraj.net
fuente
1
ERROR: error de validación, motivo (s): cornsoup tiene una imagen y una ruta de compilación especificadas. Un servicio se puede construir a imagen o usar una imagen existente, no ambas. (docker-compose 1.6.2)
zx1986
@ zx1986 para eso tiene que usar una nueva versión del archivo docker-compose.yml, consulte este docs.docker.com/compose/compose-file/#upgrading En función de eso actualicé mi respuesta
arulraj.net
50

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 utilizando el --project-nameargumento:

$ 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:y image: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
Wernight
fuente
1
--project-nameya no parece ser aceptado. Usando 1.23.2
Steven Vachon
21

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, nuestrodocker-compose siempre se basa en la imagen específica. Esto permite un par de posibilidades diferentes:

1- Puede asegurarse de que donde sea que ejecute su docker-compose , siempre usarás la última versión de esa imagen específica.

2- Puede especificar múltiples imágenes con nombre en su docker-compose archivo y dejar que se conecten automáticamente a través del paso de compilación anterior.

Entonces, si su imagen ya está construida, puede nombrarla con docker-compose. Eliminar buildy especificarimage:

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
miau
fuente
10

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 tiene nombre <none>cuando vaya docker images.

GHETTO.CHiLD
fuente
3
¿Es posible especificar las etiquetas con docker-compose?
Robert
Las etiquetas no parecen ser compatibles en este momento.
GHETTO.CHiLD
1
¿Entonces tengo que construir la imagen y luego volver a etiquetarla? No es realmente útil, espero que el docker-compose solucione este problema rápidamente
Robert
1
si está creando un entorno de contenedores múltiples, sí. si está creando un entorno de contenedor único, siempre puede irdocker build -t mytag:version .
GHETTO.CHiLD