2016-05-07 4 views
11

У меня есть файл Docker, на который я указываю файл docker-compose.yml.Docker-compose volume mount перед запуском

Хотелось бы установить громкость в файле docker-compose.yml перед RUN в файле Docker.

Dockerfile:

FROM node 

WORKDIR /usr/src/app 

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

ENTRYPOINT gulp watch 

докер-compose.yml

version: '2' 

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

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

Это имеет полный смысл для того, чтобы сделать Dockerfile первый, а затем смонтировать Докер-композе, однако есть способ обойти это.

Я хочу, чтобы файл Dockerfile был общим, передавая более конкретные бит из композиции. Возможно, это не лучшая практика?

ответ

15

Erik Dannenberg's Правильно, объемное расслоение означает, что то, что я пытаюсь сделать, не имеет смысла. (Существует еще одно действительно хорошее объяснение на Docker website, если вы хотите прочитать больше). Если я хочу, чтобы иметь Docker сделать npm install тогда я мог бы сделать это следующим образом:

FROM node 

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

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

CMD ["gulp", "watch"] 

Однако это не подходит в качестве решения для моей ситуации. Цель состоит в том, чтобы использовать NPM для установки зависимостей проекта, а затем запустить gulp для создания моего проекта. Это означает, что мне нужен доступ на чтение и запись к папке проекта и, она должна сохраняться после исчезновения контейнера.


мне нужно сделать две вещи после того, как объем установлен, поэтому я придумал следующее решение ...

докер/Глоток/Dockerfile:

FROM node 

RUN npm install --global gulp-cli 

ADD start-gulp.sh . 

CMD ./start-gulp.sh 

докер/глотком /start-gulp.sh:

#!/usr/bin/env bash 

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

докер-compose.yml:

version: '2' 

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

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

Так что теперь контейнер начинает Баш скрипт, который будет непрерывно циклично, пока он может попасть в каталог и выполнения npm install. Это все еще довольно хрупкое, но оно работает. :)

+0

T H A N K Y O U для этого ответа. Я пытался решить такую ​​же проблему с помощью webpack. https://stackoverflow.com/questions/41058764/dockerized-django-with-webpackdevserver/41075389#41075389 – Pietro

+0

вы рок-холмы! сладкий ответ –

11

Вы не можете монтировать папки хоста или тома во время сборки Docker. Это позволит скомпрометировать повторяемость сборки. Единственный способ получить доступ к локальным данным во время сборки Docker - это контекст сборки, который есть все в PATH или URL, которые вы передали команде build. Обратите внимание, что Dockerfile должен существовать где-то в контексте. См. https://docs.docker.com/engine/reference/commandline/build/ для получения более подробной информации.

+0

Чтобы уточнить, в соответствии с рекомендацией, это приведет к компрометации повторяемости сборки^на удаленных хостах докеров. Если вы этого не делаете, я не вижу, как предварительная компоновка ссылочных файлов внутри каталога сборки docker делает сборки более повторяемыми, но это означает, что вам нужен внешний механизм сборки. Даже докеры не могут этого сделать, поэтому вам нужен еще один уровень сборки. Больше слоев -> сложнее. Глупо. В любом случае, вы можете использовать https: // github.com/CheggEng/dockerx, если вы хотите иметь возможность монтировать каталоги во время сборки, предопределять параметры сборки и не вводить тонну другого синтаксиса для докеров. –

Смежные вопросы