Jak zdefiniować nazwę obrazu zbudowanego za pomocą narzędzia dokowania-tworzenia

202

Używam Docker-Compose do tworzenia środowiska programistycznego. Chcę zbudować konkretny obraz, ale nie wiem, jak ustawić nazwę tego obrazu.

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

Kiedy wykonuję docker-composewszystko jest w porządku, ale otrzymuję losową nazwę nowego obrazu. Czy można ustawić nazwę obrazu kompilacji?

Robert
źródło
17
Jeśli używasz kompilatora dokerów do zbudowania obrazu, zawsze będzie to nazwa obrazu <project>_<service>, gdzie <service>w tym przykładzie jest, wildflya domyślnym projektem jest nazwa katalogu, w którym się znajdujesz. Możesz to zmienić za pomocą zmiennej środowiskowej -plub COMPOSE_PROJECT_NAME. Nie ma możliwości ustawienia niestandardowej nazwy obrazu.
dnephin
1
czy nie ma akceptowalnych odpowiedzi?
AmanicA,
docs.docker.com/docker-cloud/apps/service-links - oficjalny dokument na ten temat
Ivan Aracki
2
można również ustawić COMPOSE_PROJECT_NAME=xw .envi kontenerów będzie nazwany{x}_{service}_{#}
eMPee584

Odpowiedzi:

181

W przypadku formatu pliku skomponowanego w wersji dokowanej można zbudować i oznaczyć obraz dla jednej usługi, a następnie użyć tego samego obrazu dla innej usługi.

W moim przypadku chcę skonfigurować elastyczny klaster wyszukiwania z 2 węzłami, oba muszą używać tego samego obrazu, ale skonfigurowane do działania w inny sposób. Chcę także zbudować własny obraz elasticsearch z własnego pliku Docker. Oto co zrobiłem (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

Widać, że w pierwszej definicji usługi „es-master” używam opcji „build”, aby zbudować obraz z Dockerfile w ./elasticsearch. Oznaczam obrazek nazwą „porter / elasticsearch” opcją „image”. Następnie odsyłam do tego wbudowanego obrazu w definicji usługi „es-node” z opcją „image”, a także używam parametru „depend_on”, aby upewnić się, że drugi kontener „es-master” jest zbudowany i uruchomiony jako pierwszy.

Jason White
źródło
55
Ta opcja container_name:naprawdę pomogła.
Bruno Bieri,
2
Jesteś pewien, że to działa? buildi imagewzajemnie się wykluczają. Otrzymuję komunikat „Usługa xxx ma zarówno obraz, jak i ścieżkę kompilacji. Usługa może zostać zbudowana do obrazu lub użyć istniejącego obrazu, a nie obu.”
Burhan Ali
3
Och nieważne. Te dwa mogą być używane razem w formacie v2 i nowszych. To, co testowałem, nie określiło wersji, więc domyślam się, że to v1.
Burhan Ali
3
Opcja
nazwa_kontenera
2
@BrunoBieri depends_onużywa nazwy usługi w doker-composepliku, nie trzeba określać nazwy kontenera. Nawet przykład pokazuje to depends_on: es-masteri niedepends_on: es_master
blueFast
65

Zgodnie z dokerem-komponuj 1.6.0 :

Możesz teraz określić zarówno kompilację, jak i klucz obrazu, jeśli używasz nowego formatu pliku. docker-compose buildzbuduje obraz i oznaczy go podaną nazwą, a docker-compose pullspróbuje go wyciągnąć.

Tak docker-compose.ymlbyś był

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

Aby zaktualizować komponowanie dokera

sudo pip install -U docker-compose==1.6.0
arulraj.net
źródło
1
BŁĄD: sprawdzanie poprawności nie powiodło się, powód (y): w cornsoup określono zarówno obraz, jak i ścieżkę kompilacji. Usługę można zbudować do obrazu lub użyć istniejącego obrazu, a nie obu. (docker-compose 1.6.2)
zx1986
@ zx1986, ponieważ musisz użyć nowej wersji pliku docker-compose.yml, zapoznaj się z tym docs.docker.com/compose/compose-file/#upgrading Na podstawie tej zaktualizowanej mojej odpowiedzi
arulraj.net
50

Opcja 1: Wskazanie domyślnej nazwy obrazu

Nazwa obrazu wygenerowanego przez docker-compose zależy domyślnie od nazwy folderu, ale można go zastąpić za pomocą --project-nameargumentu:

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

Opcja 2: Określenie nazwy obrazu

Po wydaniu docker -compose 1.6.0 możesz określić build:i image:mieć jawną nazwę obrazu (patrz odpowiedź arulraj.net ).

Opcja 3: Utwórz obraz z kontenera

Trzecim jest utworzenie obrazu z kontenera:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar
Wernight
źródło
1
--project-namenie wydaje się już akceptowany. Korzystanie 1.23.2
Steven Vachon
21

W zależności od przypadku użycia możesz użyć obrazu, który został już utworzony i podać jego nazwę w docker-compose.

Mamy przypadek użycia produkcyjnego, w którym nasz serwer CI buduje obraz o nazwie Docker. ( docker build -t <specific_image_name> .). Po określeniu nazwanego obrazu, nasz docker-composezawsze opiera się na konkretnym obrazie. Pozwala to na kilka różnych możliwości:

1- Możesz zapewnić, że gdziekolwiek uruchomisz docker-compose, zawsze będziesz używać najnowszej wersji tego konkretnego obrazu.

2- Możesz określić wiele nazwanych obrazów w swoim docker-composepliku i pozwolić, aby były one automatycznie okablowane w poprzednim kroku kompilacji.

Tak więc, jeśli twój obraz jest już zbudowany, możesz nazwać go obrazem docker-compose. Usuń buildi określimage:

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
meoww-
źródło
10

po zbudowaniu obrazu wykonaj następujące czynności:

docker tag <image id> mynewtag:version

potem zobaczysz, że twój obraz nie jest już nazwany, <none>kiedy idziesz docker images.

GHETTO.CHiLD
źródło
3
Czy można określić tagi za pomocą funkcji dokowania-tworzenia?
Robert
tagi nie wyglądają obecnie na obsługiwane.
GHETTO.CHiLD
1
Więc muszę zbudować obraz, a później ponownie go otagować? Nie jest to naprawdę przydatne, mam nadzieję, że kompilacja dokerów szybko rozwiąże ten problem?
Robert
1
jeśli budujesz środowisko z wieloma kontenerami tak. jeśli docker build -t mytag:version .
budujesz