web-dev-qa-db-fra.com

Fichier Docker-compose.yml qui construit une image de base, puis les enfants qui s’y basent?

Par souci de clarté, lorsque je parle d’image de base, je veux parler de l’image parente qui présente toutes les configurations courantes, de sorte que les enfants qui en dépendent n’ont pas besoin de télécharger les dépendances individuellement.

À ma connaissance, les fichiers docker-compose.yml sont les configurations au moment de l’exécution, tandis que les fichiers Docker sont les configurations au moment de la construction. Cependant, il existe une option build utilisant docker-compose, et je me demandais comment je pourrais l'utiliser pour créer une image de base.

À partir de maintenant, j'utilise un script de shell qui exécute d'autres scripts de shell. On construit toutes mes images, à partir d'une image de base qu'il crée également. L'autre les exécute en tant que conteneurs avec les configurations nécessaires. Cependant, l'image de base n'est jamais exécutée en tant que conteneur.

Actuellement, le shellscript que j'espère transformer en fichier docker-composé ressemble à ceci:

echo "Creating docker network net1"
docker network create net1

echo "Running api as a container with port 5000 exposed on net1"
docker run --name api_cntr --net net1 -d -p 5000:5000 api_img

echo "Running redis service with port 6379 exposed on net1"
docker run --name message_service --net net1 -p 6379:6379 -d redis

echo "Running celery worker on net1"
docker run --name celery_worker1 --net net1 -d celery_worker_img

echo "Running flower HUD on net1 with port 5555 exposed"
docker run --name flower_hud --net net1 -d -p 5555:5555 flower_hud_img

Le shell-script qui fait les images, est comme suit:

echo "Building Base Image"
docker build -t base ../base-image

echo "Building api image from Dockerfile"
docker build -t api_img  ../api

echo "Building celery worker image"
docker build -t celery_worker_img ../celery-worker

echo "Building celery worker HUD"
docker build -t flower_hud_img ../flower-hud

Mes questions se résument à une chose. Puis-je créer cette image de base sans jamais l'exécuter dans un conteneur avec docker-compose? (Tous les fichiers Docker commencent par FROM base:latest autre que la base elle-même). Je cherche à rendre la tâche aussi facile que possible pour les autres personnes, de sorte qu'elles ne doivent exécuter qu'une seule commande.

EDIT: J'utilise la version 3 et, conformément à la documentation, build: est ignoré, et docker-compose accepte uniquement les images prédéfinies.

5
Will Parzybok

Selon la documentation, l'option build d'un service prend un répertoire comme argument contenant le fameux Dockerfile. Il n'y a aucun moyen de construire une image de base, puis l'image réelle du service.

Docker est un environnement dans lequel votre application s'exécute. Lorsque vous créez une image de base, il doit contenir des éléments qui ne vont pas changer souvent. Ensuite, vous devez créer une seule fois baseiamge, le télécharger dans votre référentiel et utiliser FROM baseimage:latest dans le fichier Docker.

Par exemple, si vous construisez une application python, vous pouvez la créer à partir de python et installer la configuration requise:

FROM python:3.6
COPY requirements.txt .
RUN pip install -r requirements.txt

ici, python:3.6 est l’image de base qui ne va pas souvent changer et vous n’aurez donc pas besoin de la construire à chaque fois que vous exécutez des commandes de docker compose .

3
vedarthk

Oui, en quelque sorte. Utilisez-le comme ceci:

version: '2'

services:

    wls-admin:
        container_name: wls-admin
        image: weblogic-domain
        build:
            context: wls-admin
            args:
                - ADMIN_PORT=${WLS_ADMIN_PORT}
                - CLUSTER_NAME=${WLS_CLUSTER_NAME}
                - PRODUCTION_MODE=dev
        networks:
            - wls-network

La clause image permet ici à docker-compose build de générer une image de menu fixe nommée weblogic-domain pour ce service. Cette image peut être réutilisée par les fichiers Docker des autres services, même dans le même processus de construction.

2
Adonai

À partir du shellscript qui crée les images, nous pouvons voir que vous avez différents fichiers de base dans différents répertoires. Vous pouvez l'utiliser pour créer un fichier docker-compose.yml. Les paramètres build sont utilisés pour indiquer au menu fixe comment construire l’image.

Vous pouvez utiliser ces fichiers docker dans votre fichier de composition de la manière suivante:

version: '3'
services:

  api_cntr:
    image: api_img
    build:
      context: ./api
    container_name:api_cntr
    ports:
      - 5000:5000

Ici, j'ai supposé que votre fichier docker-compose.yml est placé dans un dossier qui contient également un répertoire appelé base-image. Et base-image a une dockerfile qui est utilisée pour construire l'image.

Cela peut être la structure d'un de vos services. De manière similaire, vous pouvez également créer d'autres services. Et bien que vous utilisiez docker-compose, vous ne devrez pas spécifier de réseau pour chacun, car tous les services déclarés dans un fichier docker-compose.yml font partie d’un réseau isolé.

1
Ayushya