web-dev-qa-db-fra.com

Montage de volume Docker-compose avant exécution

J'ai un Dockerfile que je pointe depuis un docker-compose.yml.

J'aimerais que le montage du volume dans le docker-compose.yml se produise avant le RUN dans le Dockerfile.

Dockerfile:

FROM node

WORKDIR /usr/src/app

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

ENTRYPOINT gulp watch

docker-compose.yml

version: '2'

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

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

Il est tout à fait logique pour lui de faire le Dockerfile d'abord, puis de monter à partir de docker-compose, mais il existe un moyen de le contourner.

Je veux garder le Dockerfile générique, tout en passant des bits plus spécifiques dans compose. Ce n'est peut-être pas la meilleure pratique?

26
DanielM

Erik Dannenberg est correct, la superposition de volume signifie que ce que j'essayais de faire n'a aucun sens. (Il y a une autre très bonne explication sur le site Web Docker si vous voulez en savoir plus). Si je veux que Docker fasse le npm install alors je pourrais le faire comme ceci:

FROM node

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

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

CMD ["gulp", "watch"]

Cependant, ce n'est pas approprié comme solution à ma situation. Le but est d'utiliser NPM pour installer les dépendances du projet, puis d'exécuter gulp pour construire mon projet. Cela signifie que j'ai besoin d'un accès en lecture et en écriture au dossier du projet et il doit persister après la disparition du conteneur.


Je dois faire deux choses une fois le volume monté, j'ai donc trouvé la solution suivante ...

docker/gulp/Dockerfile:

FROM node

RUN npm install --global gulp-cli

ADD start-gulp.sh .

CMD ./start-gulp.sh

docker/gulp/start-gulp.sh:

#!/usr/bin/env bash

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

docker-compose.yml:

version: '2'

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

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

Alors maintenant, le conteneur démarre un script bash qui bouclera en continu jusqu'à ce qu'il puisse entrer dans le répertoire et exécutez npm install. C'est encore assez fragile, mais ça marche. :)

29
DanielM

Vous ne pouvez pas monter de dossiers ou de volumes hôte pendant une génération Docker. Permettre cela compromettrait la répétabilité de la construction. Le seul moyen d'accéder aux données locales lors d'une génération Docker est le contexte de génération, qui est tout ce que vous avez passé dans la commande PATH ou URL à la commande build. Notez que le Dockerfile doit exister quelque part dans le contexte. Voir https://docs.docker.com/engine/reference/commandline/build/ pour plus de détails.

14
Erik Dannenberg