2016-09-08 2 views
7

Ich bin nicht sicher, ob mir etwas offensichtlich entweicht oder wenn es einfach nicht möglich ist, aber ich versuche, die gesamte Anwendung Stapel mit Bildern von Docker Nabe zu komponieren.Hinzufügen von Dateien zu Standardbildern mit Docker-compose

Einer von ihnen ist MySQL und unterstützt Dateien durch Volumen benutzerdefinierte Konfiguration hinzugefügt und .sql-Dateien von einem hängten Verzeichnis auszuführen.

Aber, ich habe diese Dateien auf dem Computer, auf dem ich Docker-compose renne, nicht auf dem Host. Gibt es keine Möglichkeit, Dateien von der lokalen Maschine an, in die Behälter zu kopieren, bevor sie es Einstiegspunkt/cmd laufen? Muss ich wirklich lokale Bilder von allem nur für diesen Fall erstellen?

+0

Ich habe zwei Möglichkeiten, um Ihre Daten von Ihrem lokalen Rechner zu einem Host (entweder lokal oder remote) zu kopieren. Siehe http://stackoverflow.com/a/39348811/1556338 Im Allgemeinen möchten Sie Ihre Daten vom Bild fernhalten. Dadurch wird Ihr Image in verschiedenen Umgebungen wiederverwendbar (dev/tests/prod, clientA, clientB usw.). – Alkaline

+0

Ja, 'docker cp' funktioniert, aber nicht als Teil von docker-compose, es ist ein separater Schritt. Es wäre schöner, docker-compose nicht in ein Shell-Skript zu packen, nur um dies zu erreichen. –

+0

Leider Docker komponieren ist begrenzt. Wenn Ihre Verwendung spezifischer wird, werden Sie nicht in der Lage sein, Shell-Skripte für einige Dinge zu verwenden. Compose funktioniert nicht einmal mit dem neuen Schwarm-Modus. – Alkaline

Antwort

9

Option A: Fügen Sie die Dateien in Ihr Bild ein. Dies ist weniger als ideal, da Sie Konfigurationsdateien mit Ihrem Image mischen (das eigentlich nur Ihre Binärdateien enthalten sollte, nicht Ihre Config), aber die Anforderung erfüllt, nur docker-compose zum Senden der Dateien zu verwenden.

Diese Option wird durch die Verwendung Docker-compose erreicht Ihr Bild zu bauen, und das Build werden alle Dateien aus dem Build-Verzeichnis auf dem Remote-Docker Motor senden über. Ihre docker-compose.yml würde wie folgt aussehen:

version: '2' 

services: 
    my-db-app: 
    build: db/. 
    image: custom-db 

Und db/Dockerfile würde wie folgt aussehen:

FROM mysql:latest 
COPY ./sql /sql 

Der Einstiegspunkt/cmd würde unverändert bleiben. Sie müßten docker-compose up --build laufen, wenn das Bild bereits vorhanden ist, und Sie müssen die SQL-Dateien ändern.


Option B: ein Volumen Verwenden Sie Ihre Daten zu speichern. Dies kann nicht direkt in docker-compose erfolgen. Dies ist jedoch der bevorzugte Weg, Dateien außerhalb des Bildes in den Container einzufügen. Sie können die Lautstärke über das Netzwerk füllen, indem die Docker CLI und Eingabeumleitung zusammen mit einem Befehl wie Teer Verwendung dieser Dateien werden über stdin zu packen und entpacken gesendet:

tar -cC sql . | docker run --rm -it -v sql-files:/sql \ 
    busybox /bin/sh -c "tar -xC /sql" 

ausführen, die ein Skript über und dann das gleiche haben script bounce den DB-Container, um diese Konfiguration neu zu laden.


Option C: eine Art von Netzwerk verbunden Dateisystem verwendet werden. Wenn Sie NFS auf dem Host konfigurieren können, wo Sie Ihre Docker CLI ausgeführt werden, können Sie auf diese NFS-Shares von der entfernten Docker Knoten mit einer der folgenden Optionen an:

# create a reusable volume 
$ docker volume create --driver local \ 
    --opt type=nfs \ 
    --opt o=addr=192.168.1.1,rw \ 
    --opt device=:/path/to/dir \ 
    foo 

# or from the docker run command 
$ docker run -it --rm \ 
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \ 
    foo 

# or to create a service 
$ docker service create \ 
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \ 
    foo 

Option D: Mit dem Schwarm-Modus können Sie Dateien als Konfigurationen in Ihr Bild einfügen. Dadurch können Konfigurationsdateien, die normalerweise an einen beliebigen Knoten im Schwarm gesendet werden müssen, auf Anforderung an den Knoten gesendet werden, auf dem der Dienst ausgeführt wird. Dies verwendet eine Datei docker-compose.yml, um es zu definieren, aber der Schwarm-Modus verwendet nicht docker-compose selbst, daher passt dies möglicherweise nicht zu Ihren spezifischen Anforderungen. Sie können einen Cluster-Modus mit einem einzigen Knoten ausführen, sodass diese Option auch dann verfügbar ist, wenn Sie nur einen einzigen Knoten haben. Diese Option erfordert, dass jede Ihrer SQL-Dateien als separate Konfiguration hinzugefügt wird.Die docker-compose.yml würde wie folgt aussehen:

version: '3.4' 

configs: 
    sql_file_1: 
    file: ./file_1.sql 

services 
    my-db-app: 
    image: my-db-app:latest 
    configs: 
     - source: sql_file_1 
     target: /sql/file_1.sql 
     mode: 444 

Dann anstelle eines docker-compose up Sie eine docker stack deploy -c docker-compose.yml my-db-stack gerannt. Diese

3

ist, wie ich es tue, mit einem Volumen:

services: 
    my-db-app: 
    command: /shell_scripts/go.sh 
    volumes: 
     - ./shell_scripts:/shell_scripts 
+2

Dies funktioniert nicht, wenn sich Shell_Scripts auf einem anderen Host als dem Remote-Docker-Server befinden. – BMitch

0

Als neueres Update auf diese Frage: mit einem Docker Schwarm auf Amazon gehostet, zum Beispiel können Sie ein Volumen definieren, das sein kann geteilt durch Dienste und ist über alle Knoten des Schwarms verfügbar (unter Verwendung des cloudstor Treibers, der seinerseits AWS EFS für Persistenz zugrunde liegt).

version: '3.3' 
services: 
    my-db-app: 
    command: /shell_scripts/go.sh 
    volumes: 
     shell_scripts:/shell_scripts 
volumes: 
    shell_scripts: 
     driver: "cloudstor:aws" 
2

Mein Ruf zu niedrig ist daher zu kommentieren ich eine neue Antwort bin erstellen, Adam Spence 's Antwort fehlt die ‚-‘ für die Volumen-Option, weil Volumen muss ein Array sein, wie unter:

services: 
    my-db-app: 
    command: /shell_scripts/go.sh 
    volumes: 
     - ./shell_scripts:/shell_scripts 
+1

Sie können Änderungen auch bei geringer Reputation vorschlagen. Siehe die Option "Verbessere diese Antwort" unter jeder Antwort. – BMitch

Verwandte Themen