2015-04-23 27 views
8

Uso la finestra mobile-compose e mi piacerebbe utilizzare diversi file Docker per la creazione di passaggi di diversi servizi. Lo docs sembra suggerire di posizionare diversi file Docker in diverse directory, ma mi piacerebbe che fossero tutti nella stessa (e forse distinguibili usando la seguente convenzione: Dockerfile.postgres, Dockerfile.main ...). È possibile?docker-compose: utilizzo di più file Docker per più servizi

Edit: Lo scenario che ho contiene questo file finestra mobile-composizione:

main: 
    build: . 
    volumes: 
    - .:/code 
    environment: 
    - DEBUG=true 

postgresdb: 
    extends: 
    file: docker-compose.yml 
    service: main 
    build: utils/sql/ 
    ports: 
    - "5432" 
    environment: 
    - DEBUG=true 

dove postgresdb s' Dockerfile è:

FROM postgres 

# http://www.slideshare.net/tarkasteve/developerweek-2015-docker-tutorial 
ADD make-db.sh /docker-entrypoint-initdb.d/ 

e la principale è:

FROM python:2.7 

RUN mkdir /code 
WORKDIR /code 
ADD requirements.txt /code/ 

RUN pip install --upgrade pip 
RUN pip install -r requirements.txt 
ADD . /code/ 

Questo funziona al momento, ma mi piacerebbe ext Terminare il file Dockerfile postgresdb chiamando uno script Python che crea tabelle nel database in base a modelli costruiti su SQL Alchemy (lo script Python sarebbe chiamato come python manage.py create_tables). Volevo aggiungerlo al db's Dockerfile, ma a causa dell'isolamento dei contenitori non posso usare SQL Alchemy perché l'immagine è basata sull'immagine postgres invece che su Python e non contiene il pacchetto sqlalchemy.

Cosa posso fare? Ho provato a utilizzare il servizio main in postgresdb, ma sfortunatamente non supporta python e i suoi pacchetti, quindi non riesco ancora a scrivere un singolo Dockerfile che crea il database Postgres (tramite lo script della shell) e le sue tabelle (attraverso uno script Python).

risposta

11

Questo non è possibile a causa del modo in cui Docker gestisce i contesti di costruzione.

È necessario utilizzare e inserire un Dockerfile in ogni directory che diventa parte del contesto di build Docker per del servizio.

See: Dockerfile

Sarà infatti richiedere una docker-compose.yml che assomiglia:

service1: 
    build: service1 

service2: 
    build: service2 

See: docker-compose

Aggiornamento:

per rispondere alle vostre particolare uso- caso - Mentre capisco cosa stai cercando di fare a e perché personalmente non lo farei personalmente. L'isolamento è una cosa buona e aiuta a gestire le aspettative e la complessità. Eseguivo la "creazione del database" come un altro contenitore basato sul codice sorgente della tua app o all'interno del contenitore dell'app stesso.

In alternativa si poteva guardare soluzioni più script e basati su modelli come la shutit (non ho alcuna esperienza in ma sentito dio thigns su).

FWIW: Separazione delle preoccupazioni FTW :)

+0

Ehi James - grazie! Ho modificato la domanda e ho aggiunto la ragione per cui volevo farlo; sapresti come estendere i servizi per risolvere questo problema? Grazie ancora! – aralar

1

creatore di ShutIt qui.Gratuito di sentire che le persone sentono cose positive a riguardo.

Per essere onesti, nella tua posizione scriverei il tuo Dockerfile e utilizzare la gestione dei pacchetti standard come apt o yum. Un rapido controllo con un'immagine ubuntu e python-pip e python-sqlalchemy sono disponibili gratuitamente.

Ci sono soluzioni più contorte che potrebbero funzionare con ShutIt, felice di discuterne offline, perché penso che sia un po 'fuori tema. ShutIt è stato scritto per questo tipo di caso d'uso, in quanto ho potuto vedere che questo sarebbe stato un problema comune data l'utilità limitata di Dockerfiles al di fuori dello spazio dei microservizi.

Problemi correlati