2016-06-20 12 views
9

Zakładając Mam zestaw obrazów, które zależą od wspólnej podstawy obrazu:Budowanie wspólnych zależności z docker-komponować

  • bazowej (jest to tylko zbiór wspólnych zależnościach)

    FROM ubuntu:16.04 
    
    ENV FOO 1 
    
  • child1

    FROM mybaseimage # where mybaseimage corresponds to base 
    
    CMD ["bar1_command"] 
    
  • child2

    FROM mybaseimage # where mybaseimage corresponds to base 
    
    CMD ["bar2_command"] 
    

Czy jest możliwe aby utworzyć plik docker-compose co budować base bez uruchamiania go? Powiedzmy mam następujące zależności:

version: '2' 
services: 
    child1: 
     build: ./path-to-child1-dockerfile 
services: 
    child2: 
     build: ./path-to-child2-dockerfile 
    depends_on: 
     - child1 

Chciałbym base się zbudować, nawet jeśli nie jest to wyraźnie zaczęło. Czy coś takiego jest możliwe? Czy powinienem po prostu użyć zewnętrznego Makefile do budowania zależności?

build_base: 
    docker build -t mybaseimage mybaseimage 

build_all: build_base 
    docker-compose build 

Odpowiedz

8

Użyj pliku Makefile. Funkcja docker-compose nie jest przeznaczona do tworzenia łańcuchów obrazów, jest przeznaczona do uruchamiania kontenerów.

Możesz również być zainteresowany dobi, który jest narzędziem do automatyzacji kompilacji (takim jak marka) zaprojektowanym do pracy z obrazami i kontenerami w doku.

Disclaimer: Jestem autorem dobi

-2

Działa to w dokowanym-komponować 1.8.1

+7

Czy możesz podać szczegóły? –

+0

Przepraszam, że nie podałem więcej informacji. @Birchlabs odpowiedź powyżej to, co działa. – robbin

4

To możliwe. Istnieje pewien rodzaj obejścia. Jesteś blisko, ale brakowało ci wyraźnych tagów graficznych (dzięki czemu nie masz wystarczających możliwości, by na obrazkach podrzędnych zadeklarować, który obraz odziedziczyłeś).

version: '3.2' 
services: 
    base: 
    image: mybaseimage 
    build: ./path-to-base-dockerfile 
    child1: 
    build: ./path-to-child1-dockerfile 
    depends_on: 
     - base 
    child2: 
    build: ./path-to-child2-dockerfile 
    depends_on: 
     - base 

Załóżmy, że nie masz żadnych zdjęć. Prowadzisz docker-compose up. Następujące rzeczy się wydarzą:

  • Docker-compose widzi, że usługi child1 i child2 zależą od bazy. Więc najpierw wdroży bazę.
  • Docker-compose widzi, że jeszcze nie oznaczono żadnego obrazu jako mybaseimage. Wie, jak zbudować mybaseimage (dałeś mu ścieżkę budowania), więc zbuduje ją teraz i oznaczy ją jako mybaseimage.
  • docker-compose wdraża usługę base.
    • Idealnie powinieneś zaprojektować base tak, że natychmiast zamyka się lub nie ma punktu wejścia. ponieważ nie musimy faktycznie chcesz uruchomić tę usługę.
  • doker-komponować uważa wdrażania child1 i child2
  • Döcker-Compose widzi, że nie zostały jeszcze otagowane dowolny obraz jako child1.Wie, jak zbudować child1 (dałeś mu ścieżkę budowania), więc zbuduje ją teraz i oznaczy ją jako child1.
  • doker-komponować wdraża child1 usług
  • samą sekwencję kroków dla child2

Następny docker-compose up będzie prostszy (mamy oznaczonych zdjęć dostępne, więc pominąć wszystkie etapy budowy).

Jeśli masz już oznaczone obrazy i chcesz je odbudować: użyj polecenia docker-compose build, aby wygenerować wszystkie obrazy (tak, baza i dzieci zostaną przebudowane).