2014-11-30 19 views
23

E 'possibile combinare due immagini in una?Docker: Combina più immagini

Ti piace questa qui:

genericA -- 
      \ 
      ---> specificAB 
      /
genericB -- 

Per esempio c'è un'immagine per Java e un'immagine per MySQL.

Mi piacerebbe avere un'immagine con Java e MySQL.

risposta

8

No, è possibile ereditare solo da un'immagine.

Probabilmente non vuoi Java e MySQL nella stessa immagine in quanto è più idiota avere un singolo componente in un contenitore, cioè creare un contenitore MySQL separato e collegarlo al contenitore Java invece di inserirlo nello stesso contenitore .

Tuttavia, se è necessario averli nella stessa immagine, scrivere un file Docker con Java come immagine di base (istruzione FROM) e installare MySQL nel file Docker. Dovresti essere in grado di copiare in gran parte le dichiarazioni dal file Docker ufficiale MySQL.

+0

Grazie per la tua risposta. Dal momento che sono molto nuovo in Docker (l'ho installato 3 ore fa ;-) una rapida domanda di follow-up: Perché ho bisogno di Dockerfiles? Non posso semplicemente creare un, non so come sia chiamato in "Docker-terms", snapshot (?) Del contenitore Java e quindi installare manualmente MySQL (con apt-get, ecc.) In esso? – Frizz

+0

È possibile farlo con "committente docker". Il problema è che non è ripetibile, quindi se vuoi cambiare qualcosa devi ricominciare da capo. I Dockerfiles sono sicuramente la strada da percorrere. –

1

Se lo fai docker commit, non è a portata di mano per vedere quali comandi sono stati utilizzati al fine di costruire il vostro contenitore, è necessario emettere un docker history image

Se si dispone di un Dockerfile, basta guardare a esso e si vede come è stato costruito e cosa contiene.

Il docker commit è 'a mano', quindi soggetto a errori, docker build utilizzando un file Docker che funziona è molto meglio.

-3

È possibile inserire più comandi FROM in un singolo file Docker.

https://docs.docker.com/reference/builder/#from

+7

'FROM può apparire più volte all'interno di un singolo Dockerfile ** per creare più immagini. **' - dal tuo link. Quindi, non combina le immagini, ma crea invece più immagini – luxas

9

Docker non supporta direttamente questo, ma è possibile utilizzare DockerMake (Full Disclosure: ho scritto) per gestire questa sorta di "eredità". Usa un file YAML per impostare i singoli pezzi dell'immagine, quindi guida la generazione generando i Dockerfile appropriati.

Ecco come si dovrebbe costruire questo esempio un po 'più complicato:

         --> genericA -- 
            /    \ 
     debian:jessie --> customBase     ---> specificAB 
            \    /
             --> genericB -- 

si può usare questa DockerMake.yml di file:

specificAB: 
    requires: 
    - genericA 
    - genericB 

genericA: 
    requires: 
    - customBase 
    build_directory: [some local directory] 
    build: | 
    #Dockerfile commands go here, such as 
    ADD installA.sh 
    RUN ./installA.sh 

genericB: 
    requires: 
    - customBase 
    build: | 
    #Here are some other commands you could run 
    RUN apt-get install -y genericB 
    ENV PATH=$PATH:something 

customBase: 
    FROM: debian:jessie 
    build: | 
    RUN apt-get update && apt-get install -y buildessentials 

Dopo aver installato lo strumento docker-make CLI (pip install dockermake), si può quindi costruire l'immagine specificAB solo eseguendo

docker-make specificAB 
Problemi correlati