2016-08-18 6 views
3

Si je cours composer install de mon hôte, je frappe mon cache compositeur local:Comment mettre en cache les téléchargements du gestionnaire de paquets pour les versions de docker?

- Installing deft/iso3166-utility (1.0.0) 
    Loading from cache 

Pourtant, lors de la construction d'un conteneur ayant dans sa Dockerfile:

RUN composer install -n -o --no-dev 

je télécharger toutes les choses, par exemple:

- Installing deft/iso3166-utility (1.0.0) 
    Downloading: 100%   

C'est normal, mais j'aime l'éviter. Comme même sur une reconstruction, il serait également tout télécharger à nouveau.

Je voudrais avoir un cache universel pour compositeur que je pourrais également partager pour d'autres projets docker.

Je regardai cette question et trouvé l'approche define a volume in the Dockerfile:

ENV COMPOSER_HOME=/var/composer 
VOLUME /var/composer 

J'ai ajouté que à mon Dockerfile, et devrait seulement télécharger les fichiers une fois, et appuyez sur le cache après.

Pourtant, quand je modifie mon composer, par exemple. supprimer le drapeau -o, et relancer docker build ., je m'attendais à frapper le cache sur la construction, mais je télécharge encore les vendeurs à nouveau.

Comment les volumes sont supposés fonctionner pour avoir un cache de données dans un conteneur docker?

+0

Le volume persistera pour une instance de conteneur, mais pas sur la construction. Vous pouvez créer un volume nommé qui persistera dans un emplacement statique, mais vous couplerez une solution à un environnement. Vous devez penser à ce que vous voulez faire dans la construction vs après. Vous pouvez configurer une sorte de référentiel local pour agir en tant que cache/proxy. – ldg

+0

Je me bats aussi avec ça. Avez-vous trouvé un moyen de sortir de cela? Je pensais que peut-être utiliser un proxy HTTP et diriger Docker à utiliser pourrait fonctionner. Potentiellement excluant hub.docker.com à partir du proxy pour ne pas conserver deux copies d'images téléchargées. – gooli

+0

@gooli Posté une réponse sur comment je traite le problème. Merci pour le rappel. – k0pernikus

Répondre

1

J'ai trouvé deux façons de traiter ce problème, mais aucune ne traite plus des volumes compositeur.

  1. Fasten processus de téléchargement du compositeur: Utilisez hirak/prestissimo

    composer global require "hirak/prestissimo:^0.3" 
    
  2. force docker utiliser un compositeur cache installer.
    Docker utilise un cache sur un RUN si les fichiers ajoutés n'ont pas changé. Si vous ne faites que COPY . /your-php-app, docker build actualisera tous les gains et ré-exécuter l'installation de composer même si un seul fichier non lié dans l'arborescence des sources a changé.
    Afin de faire construire docker pour exécuter installer installer seulement sur les changements de package, il faut ajouter composer.json et composer.lock fichier avant d'ajouter les fichiers source. Comme on a aussi besoin des fichiers source, on doit utiliser des dossiers différents pour l'installation de composeur et rsync le contenu dans le dossier alors ajouté; en outre, il faut ensuite exécuter les scripts de post-installation manuellement.
    Il devrait ressembler à ceci (non testé):

    WORKDIR /tmp/ 
    COPY composer.json composer.lock ./ 
    RUN composer install -n -o --no-dev --no-scripts 
    
    WORKDIR /your-php-app/ 
    COPY . /your-php-app/ 
    RUN rsync -ah /tmp/* /your/php-app/ 
    RUN composer run-script post-install-cmd 
    

ou combiner les deux =)