2015-08-05 4 views
2

donc actuellement je peux faire: docker -v .:/usr/src/app ou même préciser dans mon docker-compose.yml:Existe-t-il un moyen de répliquer pwd dans un montage de volume pour docker dans un contexte boot2docker?

web: 
    volumes: 
    - .:/usr/src/app 

Mais lorsque je tente de définir dans mon Dockerfile:

VOLUME .:/usr/src/app 

Il ne monte pas quoi que ce soit. Maintenant je comprends les complexités dans ce que j'utilise OSX et donc je dois virtualiser l'environnement pour exécuter Docker via boot2docker, et que boot2docker résout le problème de copie en montant /User sur la machine Linux exécutant Docker.

La documentation me demande d'être explicite, mais puisque mon caractère explicite m'obligerait à nommer mon utilisateur (dans ce cas, /User/krainboltgreene/code/krainboltgreene/blankrails), il semble non-idiomatique, car cela ne fonctionne évidemment pas dans les environnements des autres.

Quelle est la solution pour cela? Je veux dire, je peux techniquement tout faire fonctionner sans (comme indiqué ci-dessus la CLI et composer fonctionne bien), mais cela signifie ne pas être en mesure de faire un provisionnement spécifique au projet (installation de bower, npm install, vulcanize, etc.

+0

Remarque: 'COPY' fonctionne très bien avec' .' comme chemin. – krainboltgreene

Répondre

1

Vous ne pouvez pas spécifier un répertoire hôte pour un volume dans un Dockerfile, en raison des raisons de portabilité que vous mentionnez (tout le monde n'aura pas les mêmes répertoires et des problèmes de sécurité concernant le montage de fichiers sensibles).

Si vous faites place:

VOLUME /usr/src/app 

Docker établira automatiquement un volume lors de l'exécution pour le dossier, qui sera mis en correspondance avec un répertoire sous /var/lib/docker/volumes.

Si vous voulez pouvoir apporter rapidement des modifications pendant le développement, je suggère d'utiliser COPY dans le Dockerfile, mais de monter les modifications locales par-dessus avec un volume au moment de l'exécution. Cela présente l'inconvénient que si vous montez un volume, tout le contenu de ce répertoire dans le conteneur sera masqué (plutôt que fusionné).

+0

"provisionnement spécifique de projec" fait référence à des choses comme "rake db: migrate". – krainboltgreene

+0

La modification de 'VOLUME/sr/src/app' n'a pas résolu le problème malheureusement, car il ne copie sur rien depuis que je suis dans l'environnement' boot2docker'. – krainboltgreene

+0

alors pourquoi ne pas faire une COPIE? Je ne vois pas vraiment où vous allez avec ça. –

0

La commande docker run -v .:/usr/src/app ... ainsi que les définitions docker-compose s'exécutent pendant runtime. Alors que les instructions Dockerfile sont exécutées pendant temps de construction. Par ailleurs, l'instruction de votre Dockerfile est syntaxiquement incorrecte. Il devrait plutôt être VOLUME /usr/src/app.

Ce mot-clé VOLUME définit uniquement que plus tard au cours de l'exécution, cet emplacement sera stocké sur un volume. Ainsi, tous les fichiers que vous ajoutez par d'autres instructions Dockerfile ou le manuel valide à cet emplacement sont ignorés et ne sont pas ajoutés à l'image résultante.

Maintenant, pendant runtime lorsque vous n'avez pas spécifié un volume, Docker va générer pour vous un volume qui est vide par défaut.Pour que votre installation docker-compose fonctionne pour d'autres collègues, vous pouvez simplement faire en sorte que le fichier de configuration docker-compose fasse partie de votre dossier de projet blankrails. Tout le monde exécute alors docker-compose à partir de ce répertoire et votre configuration fournie fonctionnera.

EDIT:

Je ne sais pas exactement ce que vous voulez dire avec le projet provisionnement spécifique. Mais si votre objectif est de fournir le contenu par défaut du volume défini, vous pouvez faire quelque chose comme ce qui suit:

  • Ajouter tous les fichiers nécessaires au projet lors de la construction Dockerfile dans un dossier /bootstrap sur l'image. Au lieu d'exécuter directement votre application, utilisez un script de démarrage pour CMD.
  • Dans ce script de démarrage, vous pouvez vérifier si le volume monté sur /usr/src/app est vide ou non. Quand il est vide, copiez tout le contenu /bootstrap dedans.
  • Ensuite, démarrez votre application depuis ce script au premier plan.

Avec cette approche, vous pouvez facilement fournir un jeu de fichiers par défaut pour les volumes montés. Et lorsque vous réutilisez ce volume, par ex. après le redémarrage du conteneur, le conteneur fonctionne uniquement avec les fichiers qui se trouvent sur le volume sans les toucher à nouveau au démarrage. Les fichiers modifiés seront donc conservés.

+0

> Attendu que les instructions Dockerfile sont exécutées pendant la construction. OK, je vois où vous allez, mais 'COPY' fonctionne très bien! – krainboltgreene

+0

J'apprécie également le pointeur de syntaxe :) – krainboltgreene

+0

A fait une modification à ma réponse et a ajouté quelques réflexions sur l'approvisionnement de projet. – h3nrik