wake-up-neo.com

Docker-compose.yml-Datei, die ein Basis-Image erstellt, dann Kinder, die darauf achten?

Zur Verdeutlichung meine ich mit Basis-Image das übergeordnete Image, das alle gängigen Konfigurationen aufweist, sodass die darauf basierenden untergeordneten Images die Abhängigkeiten nicht einzeln herunterladen müssen.

Nach meinem Verständnis sind docker-compose.yml-Dateien die Laufzeitkonfigurationen, während Dockerfiles die Erstellungszeitkonfigurationen sind. Es gibt jedoch eine build-Option, die docker-compose verwendet, und ich habe mich gefragt, wie ich damit ein Basisimage erstellen kann.

Ab sofort verwende ich ein Shellscript, das andere Shellscripts ausführt. Man erstellt alle meine Bilder aus einem Basis-Image, das es auch erstellt. Der andere führt sie als Container mit den erforderlichen Konfigurationen aus. Das Basisimage wird jedoch nie als Container ausgeführt.

Derzeit sieht das Shellscript, das ich in eine Docker-Compose-Datei ändern möchte, folgendermaßen aus:

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

Das Shellscript, das die Bilder erstellt, sieht wie folgt aus:

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

Meine Frage ist, ob ich dieses Basis-Image erstellen kann, ohne es jemals in einem Container mit Docker-Compose auszuführen. (Alle Dockerdateien beginnen mit FROM base:latest außer der Basis selbst). Ich möchte es anderen Leuten so einfach wie möglich machen, damit sie nur einen einzigen Befehl ausführen müssen.

BEARBEITEN: Ich verwende Version 3 und gemäß den Dokumenten wird build: ignoriert und Docker-Compose akzeptiert nur vorgefertigte Bilder.

5
Will Parzybok

Gemäß der Dokumentation nimmt die Option build eines Dienstes ein Verzeichnis als Argument, das die berühmte Dockerfile enthält. Es gibt keine Möglichkeit, ein Basisimage und dann das tatsächliche Image des Dienstes zu erstellen.

Docker ist eine Umgebung, in der Ihre Anwendung ausgeführt wird. Wenn Sie ein Basisimage erstellen, sollte es Dinge enthalten, die sich nicht oft ändern werden. Dann müssen Sie baseiamge einmal erstellen und in Ihr Repository hochladen und FROM baseimage:latest in der Docker-Datei verwenden.

Wenn Sie beispielsweise eine Python-Anwendung erstellen, können Sie sie aus Python erstellen und die folgenden Anforderungen installieren:

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

hier ist python:3.6 das Basis-Image, das sich nicht oft ändern wird, und Sie müssen es daher nicht jedes Mal erstellen, wenn Sie docker compose-Befehle ausführen .

3
vedarthk

Ja, irgendwie. Benutze es so:

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

Die image-Klausel bewirkt, dass docker-compose build ein Docker-Image mit dem Namen weblogic-domain für diesen Dienst generiert. Dieses Image kann von den Dockerdateien anderer Dienste auch im selben Erstellungsprozess wiederverwendet werden.

2
Adonai

An dem Shellscript, das die Bilder erstellt, können wir erkennen, dass Sie unterschiedliche Dockerdateien in unterschiedlichen Verzeichnissen haben. Damit können Sie eine docker-compose.yml-Datei erstellen. Die Einstellungen build werden verwendet, um Docker mitzuteilen, wie das Image erstellt werden soll.

Sie können diese Dockerdateien in Ihrer Erstellungsdatei folgendermaßen verwenden:

version: '3'
services:

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

Hier habe ich angenommen, dass sich Ihre docker-compose.yml-Datei in einem Ordner befindet, der auch ein Verzeichnis mit dem Namen base-image enthält. Und base-image hat eine dockerfile, mit der das Image erstellt wird.

Dies kann die Struktur eines Ihrer Dienste sein. Auf ähnliche Weise können Sie auch andere Dienste erstellen. Und während Sie docker-compose verwenden, müssen Sie nicht für jedes ein Netzwerk angeben, da alle in einer docker-compose.yml-Datei deklarierten Dienste Teil eines isolierten Netzwerks sind.

1
Ayushya