Come definisco il nome dell'immagine creato con la finestra mobile-componi


203

Sto usando la finestra mobile-componi per creare il mio ambiente di sviluppo. Voglio creare un'immagine specifica, ma non so come impostare un nome per quell'immagine.

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

Quando eseguo docker-composetutto è ok, ma ottengo un nome casuale per la nuova immagine. È possibile impostare un nome per l'immagine di costruzione?


17
Se stai usando docker-compose per costruire l'immagine, il nome dell'immagine sarà sempre <project>_<service>, dove <service>in questo esempio è wildflye proietti il ​​nome predefinito della directory in cui ti trovi. Puoi cambiarlo con -po COMPOSE_PROJECT_NAMEla variabile d'ambiente. Non è possibile impostare un nome immagine personalizzato.
dnephin,

1
non ci sono risposte accettabili?
Amanic:

docs.docker.com/docker-cloud/apps/service-links - documento ufficiale su questo argomento
Ivan Aracki

2
è anche possibile impostare COMPOSE_PROJECT_NAME=xin .enve i contenitori saranno chiamati{x}_{service}_{#}
eMPee584

Risposte:


181

Per il formato di file versione 2 comporre docker, è possibile creare e contrassegnare un'immagine per un servizio e quindi utilizzare la stessa immagine creata per un altro servizio.

Nel mio caso, voglio impostare un cluster di ricerca elastico con 2 nodi, entrambi devono utilizzare la stessa immagine, ma configurato per funzionare in modo diverso. Voglio anche creare la mia immagine personalizzata di elasticsearch dal mio Dockerfile. Quindi questo è quello che ho fatto (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

Potete vedere che nella prima definizione di servizio "es-master", utilizzo l'opzione "build" per creare un'immagine dal Dockerfile in ./elasticsearch. Taggo l'immagine con il nome "porter / elasticsearch" con l'opzione "image". Quindi faccio riferimento a questa immagine creata nella definizione del servizio "es-node" con l'opzione "image" e utilizzo anche un "depend_on" per assicurarmi che l'altro contenitore "es-master" sia stato creato ed eseguito per primo.


55
L'opzione ha container_name:davvero aiutato.
Bruno Bieri,

2
Sei sicuro che funzioni? builde imagesi escludono a vicenda. Ottengo "Il servizio xxx ha sia un'immagine sia il percorso di costruzione specificati. Un servizio può essere creato per l'immagine o utilizzare un'immagine esistente, non entrambe."
Burhan Ali

3
Oh non importa. Quei due possono essere usati insieme nel formato v2 e successivi. La cosa che stavo testando non specificava una versione, quindi suppongo che si presupponesse che fosse v1.
Burhan Ali

3
L'opzione container_name: mi ha davvero aiutato
thks

2
@BrunoBieri depends_onutilizza il nome del servizio nel doker-composefile, non è necessario specificare un nome contenitore. Anche l'esempio lo mostra depends_on: es-mastere nondepends_on: es_master
blueFast

65

Come da docker-compose 1.6.0 :

Ora puoi specificare sia una build che una chiave immagine se stai utilizzando il nuovo formato di file. docker-compose buildcostruirà l'immagine e la taggerà con il nome che hai specificato, mentre docker-compose pulltenterà di estrarla.

Quindi il tuo docker-compose.ymlsarebbe

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

Per aggiornare la finestra mobile-componi

sudo pip install -U docker-compose==1.6.0

1
ERRORE: convalida non riuscita, motivo (i): cornsoup ha sia un'immagine che un percorso di costruzione specificati. È possibile creare un servizio per creare un'immagine o utilizzare un'immagine esistente, non entrambe. (docker-compose 1.6.2)
zx1986

@ zx1986 per questo devi usare la nuova versione del file docker-compose.yml fare riferimento a questo docs.docker.com/compose/compose-file/#upgrading Sulla base di quello aggiornato la mia risposta
arulraj.net

50

Opzione 1: suggerimento nome immagine predefinito

Il nome dell'immagine generata da docker-compose dipende dal nome della cartella per impostazione predefinita, ma è possibile sovrascriverlo utilizzando l' --project-nameargomento:

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

Opzione 2: specifica del nome dell'immagine

Una volta che docker-compose 1.6.0 è uscito, puoi specificare build:e image:avere un nome esplicito per l'immagine (vedi la risposta di arulraj.net ).

Opzione 3: creare un'immagine dal contenitore

Un terzo è quello di creare un'immagine dal contenitore:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar

1
--project-namenon sembra più essere accettato. Usando 1.23.2
Steven Vachon

21

A seconda del caso d'uso, è possibile utilizzare un'immagine che è già stata creata e specificare il nome in docker-compose.

Abbiamo un caso d'uso di produzione in cui il nostro server CI crea un'immagine Docker denominata. ( docker build -t <specific_image_name> .). Una volta specificata l'immagine nominata, la nostra docker-composesi basa sempre sull'immagine specifica. Ciò consente un paio di diverse possibilità:

1- Puoi assicurarti che da dove scappi docker-compose, utilizzerai sempre l'ultima versione di quella specifica immagine.

2- È possibile specificare più immagini con nome nel docker-composefile e lasciarle cablare automaticamente durante il passaggio di creazione precedente.

Quindi, se la tua immagine è già stata creata, puoi nominare l'immagine con docker-compose. Rimuovi builde specificaimage:

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

10

dopo aver creato l'immagine, procedi come segue:

docker tag <image id> mynewtag:version

dopodiché vedrai che la tua immagine non viene più nominata <none>quando vai docker images.


3
È possibile specificare i tag con docker-compose?
Robert,

i tag non sembrano essere supportati in questo momento.
GHETTO.CHiLD,

1
Quindi devo creare l'immagine e successivamente ri-taggarla? Non è davvero utile, spero che la finestra mobile componi risolva rapidamente questo problema?
Robert,

1
se si sta creando un ambiente multi container sì. se stai costruendo un unico ambiente container, puoi sempre andaredocker build -t mytag:version .
GHETTO.CHiLD,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.