2016-06-20 1 views
9

En supposant que je suis un ensemble d'images qui dépendent d'une image de base commune:construction dépendances communes avec docker-composer

  • base (ceci est seulement un ensemble de dépendances communes)

    FROM ubuntu:16.04 
    
    ENV FOO 1 
    
  • child1

    FROM mybaseimage # where mybaseimage corresponds to base 
    
    CMD ["bar1_command"] 
    
  • child2

    FROM mybaseimage # where mybaseimage corresponds to base 
    
    CMD ["bar2_command"] 
    

Est-il possible de créer un fichier docker-compose qui construirait base sans l'exécuter? Disons que je les dépendances suivantes:

version: '2' 
services: 
    child1: 
     build: ./path-to-child1-dockerfile 
services: 
    child2: 
     build: ./path-to-child2-dockerfile 
    depends_on: 
     - child1 

Je voudrais base être construire même si elle est pas explicitement commencé. Est-ce que quelque chose comme ça est possible? Ou devrais-je simplement utiliser Makefile externe pour créer des dépendances?

build_base: 
    docker build -t mybaseimage mybaseimage 

build_all: build_base 
    docker-compose build 

Répondre

8

Utilisez un Makefile. docker-composer n'est pas conçu pour construire des chaînes d'images, il est conçu pour l'exécution de conteneurs.

Vous pouvez également être intéressé par dobi qui est un outil d'automatisation de construction (comme make) conçu pour fonctionner avec des images docker et des conteneurs.

Disclaimer: Je suis l'auteur de dobi

-2

Cela fonctionne dans docker-Compose 1.8.1

+7

Pouvez-vous donner des détails? –

+0

Excusez-vous de ne pas donner plus de détails. La réponse @birchlabs ci-dessus est ce qui fonctionne. – robbin

4

Il est possible. Il y a une sorte de solution de contournement. Vous êtes proche, mais il vous manquait des balises d'image explicites (donc vous aviez peu de possibilités sur les images enfants pour déclarer de quelle image vous avez hérité).

version: '3.2' 
services: 
    base: 
    image: mybaseimage 
    build: ./path-to-base-dockerfile 
    child1: 
    build: ./path-to-child1-dockerfile 
    depends_on: 
     - base 
    child2: 
    build: ./path-to-child2-dockerfile 
    depends_on: 
     - base 

Imaginons que vous n'ayez pas créé d'images. Vous exécutez docker-compose up. Les choses suivantes vont se produire:

  • docker-composer voit que les services child1 et child2 dépendent de la base. Donc, il va déployer la base en premier. Docker-compose voit que vous n'avez pas encore étiqueté une image en mybaseimage. Il sait comment construire mybaseimage (vous lui avez donné un chemin de construction), donc il va le construire maintenant, et le marquer comme mybaseimage. Docker-composer déploie le service base.
    • Idéalement, vous devriez concevoir base de sorte qu'il se ferme immédiatement, ou n'a pas de point d'entrée. puisque nous ne effectivement veulent que ce service soit exécuté.
  • docker-Compose considère le déploiement child1 et child2
  • docker-Compose voit que vous n'êtes pas encore une image marquée child1.Il sait comment construire child1 (vous lui avez donné un chemin de construction), donc il va le construire maintenant, et le marquer comme child1.
  • docker-Compose déploie le child1 services
  • même séquence d'étapes pour child2

La prochaine docker-compose up sera plus simple (nous avons étiqueté les images disponibles, donc nous sauter toutes les étapes construire).

Si vous avez déjà des images balisées et que vous souhaitez les reconstruire: utilisez docker-compose build pour lui demander de créer toutes les images (oui, la base et les enfants seront tous deux reconstruits).