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?
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. :)
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.