Docker-compose volume mount перед запуском

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

Я хочу, чтобы 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, а затем смонтировать из docker-compose, однако есть ли способ обойти его.

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

Ответ 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. Это все еще довольно хрупкое, но оно работает.:)

Ответ 2

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