2016-05-07 20 views
11

Mam plik Dockerfile wskazany przez docker-compose.yml.Składanie woluminu Docker-compose przed uruchomieniem

Chciałbym, aby montaż woluminu w docker-compose.yml miał miejsce przed plikiem RUN w pliku Dockerfile.

Dockerfile:

FROM node 

WORKDIR /usr/src/app 

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

ENTRYPOINT gulp watch 

doker-compose.yml

version: '2' 

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

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

To sprawia, że ​​całkowite poczucie na to, aby zrobić Dockerfile pierwszy, a następnie zamontować z Docker-komponować, jednak istnieje sposób, aby obejść to.

Chcę zachować ogólny plik Dockerfile, przekazując bardziej szczegółowe bity z komponowania. Może to nie najlepsza praktyka?

Odpowiedz

15

Erik Dannenberg's Prawdą jest, warstw objętości oznacza, że ​​to, co próbowałem zrobić, nie ma sensu. (Jest jeszcze jedno naprawdę dobre wytłumaczenie na temat Docker website, jeśli chcesz przeczytać więcej). Jeśli chcę mieć Docker zrobić npm install wtedy mogłem zrobić to tak:

FROM node 

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

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

CMD ["gulp", "watch"] 

Jednak to nie jest właściwe w postaci roztworu do mojej sytuacji. Celem jest użycie NPM do instalacji zależności projektu, a następnie uruchomienie gulp, aby zbudować mój projekt. Oznacza to, że potrzebuję dostępu do odczytu i zapisu w folderze projektu i, który musi się utrzymywać po zniknięciu kontenera.


muszę zrobić dwie rzeczy po zamontowaniu woluminu, więc wymyśliłem następujące rozwiązanie ...

doker/łyk/Dockerfile:

FROM node 

RUN npm install --global gulp-cli 

ADD start-gulp.sh . 

CMD ./start-gulp.sh 

doker/Łyk /start-gulp.sh:

#!/usr/bin/env bash 

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

doker-compose.yml:

version: '2' 

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

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

Więc teraz pojemnik uruchamia skrypt bash, który będzie stale pętla aż można dostać się do katalogu i run npm install. To wciąż jest dość kruche, ale działa. :)

+0

T H A N K Y O U dla tej odpowiedzi. Próbowałem rozwiązać ten sam problem z pakietem internetowym. https://stackoverflow.com/questions/41058764/dockerized-django-with-webpackdevserver/41075389#41075389 – Pietro

+0

you rock holmes! słodka odpowiedź –

11

Nie można montować folderów lub woluminów hosta podczas kompilacji Docker. Pozwoliłoby to na pogorszenie powtarzalności budowy. Jedynym sposobem uzyskania dostępu do danych lokalnych podczas kompilacji Docker jest kontekst kompilacji, który jest wszystkim podanym w komendzie PATH lub URL przekazanej komendzie build. Zauważ, że Dockerfile musi istnieć gdzieś w kontekście. Aby uzyskać więcej informacji, patrz https://docs.docker.com/engine/reference/commandline/build/.

+0

Aby wyjaśnić, za referencję, naraziłoby to na powtarzalność kompilacji^na zdalnych hostach dokerów ^. Jeśli tego nie robisz, nie widzę sposobu, w jaki wstępne rozmieszczanie odwoływanych plików w katalogu budowania dockera sprawia, że ​​kompilacje są bardziej powtarzalne, ale oznacza to, że potrzebujesz zewnętrznego mechanizmu kompilacji. Nawet funkcja dokujca nie może tego zrobić, więc potrzebujesz jeszcze jednego poziomu kompilacji. Więcej warstw -> większa złożoność. Głupi. W każdym razie możesz użyć https: // github.com/CheggEng/dockerx, jeśli chcesz mieć możliwość montowania katalogów w czasie kompilacji, predefiniować parametry kompilacji i nie wprowadzać mnóstwa innych składni do okna dokowania. –