Ответ 1
Эрик Данненберг правилен, объемное расслоение означает, что то, что я пытаюсь сделать, не имеет смысла. (Существует еще одно действительно хорошее объяснение на веб-сайте Docker, если вы хотите прочитать больше). Если я хочу, чтобы 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 для создания моего проекта. Это означает, что мне нужно читать и записывать доступ к папке проекта, и она должна сохраняться после того, как контейнер ушел.
Мне нужно сделать две вещи после установки тома, поэтому я придумал следующее решение...
докер/gulp/Dockerfile:
FROM node
RUN npm install --global gulp-cli
ADD start-gulp.sh .
CMD ./start-gulp.sh
Докер/gulp/Пуск- 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
Итак, теперь контейнер запускает bash script, который будет непрерывно зацикливаться до тех пор, пока он не сможет попасть в каталог и запустить npm install
. Это все еще довольно хрупкое, но оно работает.:)