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
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
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. –
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