2016-05-07 15 views
11

Ho un Dockerfile che sto indicando da un docker-compose.yml.Montare il volume del Docker-compose prima di eseguire

Mi piacerebbe che il montaggio del volume nel docker-compose.yml avvenga prima dello RUN nel Dockerfile.

Dockerfile:

FROM node 

WORKDIR /usr/src/app 

RUN npm install --global gulp-cli \ 
&& npm install 

ENTRYPOINT gulp watch 

finestra mobile-compose.yml

version: '2' 

services: 
    build_tools: 
    build: docker/gulp 
    volumes_from: 
     - build_data:rw 

    build_data: 
    image: debian:jessie 
    volumes: 
     - .:/usr/src/app 

Ha senso completo perché fare il Dockerfile prima, poi il supporto dalla finestra mobile-composizione, ma c'è un modo per aggirarlo

Voglio mantenere il Dockerfile generico, passando più bit specifici da comporre. Forse non è la migliore pratica?

risposta

15

Erik Dannenberg's è corretto, la stratificazione del volume significa che ciò che stavo cercando di fare non ha senso. (C'è un'altra spiegazione molto buona sul Docker website se vuoi saperne di più). Se voglio avere Docker fare il npm install allora potrei fare in questo modo:

FROM node 

ADD . /usr/src/app 
WORKDIR /usr/src/app 

RUN npm install --global gulp-cli \ 
&& npm install 

CMD ["gulp", "watch"] 

Tuttavia, questo non è appropriato come una soluzione per la mia situazione. L'obiettivo è utilizzare NPM per installare le dipendenze del progetto, quindi eseguire gulp per creare il mio progetto. Ciò significa che ho bisogno dell'accesso in lettura e scrittura alla cartella del progetto e che deve persistere dopo che il contenitore è sparito.


Ho bisogno di fare due cose dopo che il volume è montato, così mi si avvicinò con la seguente soluzione ...

finestra mobile/sorso/Dockerfile:

FROM node 

RUN npm install --global gulp-cli 

ADD start-gulp.sh . 

CMD ./start-gulp.sh 

finestra mobile/gulp /start-gulp.sh:

#!/usr/bin/env bash 

until cd /usr/src/app && npm install 
do 
    echo "Retrying npm install" 
done 
gulp watch 

finestra mobile-compose.yml:

version: '2' 

services: 
    build_tools: 
    build: docker/gulp 
    volumes_from: 
     - build_data:rw 

    build_data: 
    image: debian:jessie 
    volumes: 
     - .:/usr/src/app 

Così ora il contenitore inizia uno script bash che continuamente ciclo fino a quando si può ottenere nella directory e run npm install. Questo è ancora abbastanza fragile, ma funziona. :)

+0

T H A N K Y O U per questa risposta. Stavo cercando di risolvere lo stesso tipo di problema con il webpack. https://stackoverflow.com/questions/41058764/dockerized-django-with-webpackdevserver/41075389#41075389 – Pietro

+0

ti rock holmes! dolce risposta –

11

Non è possibile montare cartelle o volumi host durante la creazione di una finestra mobile. Ciò consentirebbe di compromettere la ripetibilità della costruzione. L'unico modo per accedere ai dati locali durante una build Docker è il contesto di build, che è tutto nel PATH o URL passato al comando build. Si noti che lo Dockerfile deve esistere da qualche parte nel contesto. Vedi https://docs.docker.com/engine/reference/commandline/build/ per maggiori dettagli.

+0

Per chiarire, in base al riferimento, comprometterebbe la ripetibilità della costruzione^su host di finestra mobile remoti ^. Se non lo fai, non vedo come i file di riferimento preordinati all'interno della directory di costruzione della docker rendano le ripetizioni più ripetibili, ma significa che hai bisogno di un meccanismo di compilazione esterno. Anche la docker-compose non può farlo, quindi hai bisogno di un altro livello di build. Più livelli -> più complessità. Silly. Ad ogni modo, puoi usare https: // github.com/CheggEng/dockerx se vuoi essere in grado di montare le directory al momento della compilazione, predefinire i parametri di costruzione e non introdurre una tonnellata di altra sintassi nella finestra mobile. –