Eine weitere Möglichkeit, Docker-Compose zu verwenden

Im Anschluss an den Artikel Docker + Laravel =? Ich möchte über eine ziemlich ungewöhnliche Art der Verwendung des Dienstprogramms für Docker-Compose sprechen.


Zunächst einmal für diejenigen, die nicht wissen, warum Docker-Compose erforderlich ist. Mit diesem Dienstprogramm können Sie einen Satz verwandter Dienste ausführen, die in Docker-Containern gepackt sind, auf einem separaten Host. Die Originalversion wurde in Python geschrieben und kann auf zwei Arten installiert werden:


  • über OS Batch Manager ( apt install docker-composefür Ubuntu und yum install docker-compose.noarchCentos)
  • über Python-Abhängigkeitsmanager ( pip install docker-compose)

Das Problem bei der ersten Methode ist, dass es sich in der Regel in den Repositories des Betriebssystems für Docker-Compose der alten Version befindet. Dies ist ein Problem, wenn Sie die neueste Version des Docker-Daemons verwenden oder spezifische Funktionen für eine bestimmte Version des Docker-compose.yaml-Dateiformats verwenden müssen (eine Matrix unterstützter Funktionen für Formatversionen und Docker-Compose-Dienstversionen finden Sie auf der offiziellen Docker-Website).


Jetzt haben Docker-Entwickler das Dienstprogramm umgeschrieben und als binäre Datei bereitgestellt, sodass es auf folgende Weise installiert werden kann (dies ist die derzeit empfohlene Methode)


  1. Schauen Sie sich die neueste Version unter https://github.com/docker/compose/releases an und laden Sie sie herunter


    $ sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

  2. Legen Sie die Berechtigungen zum Ausführen der Anwendung fest


    $ sudo chmod +x /usr/local/bin/docker-compose

  3. Außerdem können Sie die Autovervollständigung für Bash- und Zsh-Befehlsinterpreter festlegen .


  4. Überprüfen Sie die Installation


    $ docker-compose --version
    docker-compose version1.22.0, build 1719ceb


Ich denke, dass ein einzelnes Binärprogramm sehr cool ist, weil Wir brauchen keine Python-Abhängigkeiten zu ziehen. Ja und im Allgemeinen - vielleicht ist unsere Python-Umgebung auf dem Zielcomputer, den wir konfigurieren möchten, vollständig defekt !!!



Ein Beispiel für Verwirrung in der Python-Umgebung


Es gibt aber noch den 4. Weg, von dem ich erzählen wollte. Dies ist die Möglichkeit, Docker-Compose über Docker auszuführen. Es gibt bereits offizielle Bilder auf dem Docker Hub ( https://hub.docker.com/r/docker/compose/ ). Warum können sie gebraucht werden?


  • wenn wir mit mehreren Versionen von Docker-Compose gleichzeitig arbeiten wollen (obwohl normalerweise ziemlich stabil genug genug ist)
  • Wenn wir kein Python haben oder nicht verwenden wollen (beispielsweise haben wir ein leichtes Distributionspaket für CoreOS Container Linux )
  • Verwendung in CI / CD-Pipelines.

Lass es uns versuchen!


Da wir normalerweise Container starteten:


$ docker-compose up -d 

Durch das in den Docker-Container verpackte Dienstprogramm:


$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v "$PWD:/rootfs/$PWD" -w="/rootfs/$PWD" docker/compose:1.13.0 up -d

Zu viel Wort, oder? Das Gehirn kann zusammenbrechen, um alle diese Parameter zu speichern. Deshalb werden wir versuchen, uns das Leben leichter zu machen und einen Wrapper in der Shell-Sprache schreiben. Schauen wir uns zunächst die übergebenen Parameter an:


  • --rm- löscht den temporären Container nach dem Stoppen, d. h. Wir lassen keinen Müll im System
  • -v /var/run/docker.sock:/var/run/docker.sock - Andernfalls kann sich Docker-Compose nicht mit dem Docker-Daemon auf dem Host verbinden
  • -v "$PWD:/rootfs/$PWD" -w="/rootfs/$PWD" - Ermöglicht das Weiterleiten des aktuellen Verzeichnisses innerhalb des Containers, damit das Dienstprogramm die Docker-Compose-Datei sehen kann

Es fehlt uns immer noch die Möglichkeit, Werte in der Docker-Compose-Datei zu interpolieren. Dies ist der Prozess, durch den das Dienstprogramm Umgebungsvariablen in eine YAML-Datei einfügt. Zum Beispiel im Fragment


version: "2.1"
services:
  pg:
    image: postgres:9.6
    environment:
      POSTGRES_USER: ${POSTGRES_DB_USER}
      POSTGRES_PASSWORD: ${POSTGRES_DB_PASSWORD}

Variablen POSTGRES_DB_USERund POSTGRES_DB_PASSWORDwerden aus der Umgebung gelesen. Dies ermöglicht ein gewisses Maß an Komfort, um Docker-Compose-Dateien zu erstellen. Ie Wir müssen die Umgebung von der Hostmaschine erfassen und in den Container leiten.


Lassen Sie uns das Problem lösen, indem Sie ein Bash-Skript schreiben.


#!/bin/sh# создадим временный файл с уникальным именем
TMPFILE=$(mktemp)
# захватим окружение и запишем в файл
env > "${TMPFILE}"# сохраним версию в отдельную переменную для удобства
VERSION="1.13.0"# запустим docker-compose
docker run \
  --rm  \
  -e PWD="$PWD" \
  --env-file "${TMPFILE}"  \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v "$PWD:/rootfs/$PWD" \
  -w="/rootfs/$PWD" \
  docker/compose:"${VERSION}" \
  "$@"# удаляем временный файл с захваченным списком переменных окружения
rm "{$TMPFILE}"

Es gibt zusätzliche Zeilen:


  • -e PWD="$PWD" - nur für den Fall das aktuelle Verzeichnis weiterleiten
  • --env-file "${TMPFILE}" - hier werden alle anderen Umgebungsvariablen vom Host-Rechner übertragen
  • docker/compose:"${VERSION}" - den Namen des Bildes, nehmen Sie die Version der Variablen
  • "$@"- Diese Konstruktion ermöglicht es Ihnen, das Skript so zu verwenden, als sei es das Docker-Compose-Dienstprogramm, d. h. "transparent" übergibt seine Argumente an den Docker-Container.

Das Skript kann beispielsweise in gespeichert werden, /usr/local/bin/docker-composedas eXecute-Flag darauf setzen und verwenden. Das obige Skript erhebt nicht den Anspruch, zu 100% fehlerfrei oder fehlerfrei zu sein, sondern dient lediglich zur Veranschaulichung der Methode.


Wir verwenden diese Methode in den CI / CD-Pipelines. Es spart sogar bis zu einem gewissen Grad, da Das Ziel-Andockbild wird aus dem lokalen Cache übernommen.

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte melden Sie sich an.

War es interessant


Jetzt auch beliebt: