Opcja A: Dołącz pliki do obrazu. Jest to mniej niż idealne, ponieważ miksujesz pliki konfiguracyjne z obrazem (to powinno naprawdę zawierać tylko pliki binarne, a nie konfigurację), ale spełnia wymóg stosowania tylko plików dokowanych do wysyłania plików.
Ta opcja jest osiągana przy użyciu funkcji dokowania do budowania obrazu, a ta kompilacja wyśle wszystkie pliki z katalogu kompilacji do zdalnego silnika dokowanego. Twój docker-compose.yml
wyglądałby następująco:
version: '2'
services:
my-db-app:
build: db/.
image: custom-db
i DB/Dockerfile wyglądałby następująco:
FROM mysql:latest
COPY ./sql /sql
punkt_wejścia/cmd pozostaną niezmienione. Będziesz musiał uruchomić docker-compose up --build
, jeśli obraz już istnieje i musisz zmienić pliki sql.
Wariant B: Użyj objętość do przechowywania danych. Nie można tego zrobić bezpośrednio w komponencie docker-compose. Jednak jest to preferowany sposób dołączania plików spoza obrazu do kontenera. Można wypełnić objętość całej sieci za pomocą interfejsu CLI Döcker i przekierowanie wejścia wraz z poleceniem tar spakować i rozpakować te pliki są przesyłane stdin:
tar -cC sql . | docker run --rm -it -v sql-files:/sql \
busybox /bin/sh -c "tar -xC /sql"
prowadzonego przez skrypt, a potem mieć to samo Skrypt odbija kontener db, aby ponownie wczytać tę konfigurację.
Wariant C: użyć pewnego rodzaju sieci przyłączone plików. Jeśli można skonfigurować NFS na komputerze, w którym są uruchomione swoją Döcker CLI, można podłączyć do tych akcji NFS ze zdalnego węzła Döcker stosując jedną z poniższych opcji:
# 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
Opcja D: W trybie roju możesz zawrzeć pliki jako konfiguracje na obrazie. Pozwala to na pliki konfiguracyjne, które normalnie muszą być przekazane do dowolnego węzła w roju, aby zostać wysłane na żądanie do węzła, w którym działa twoja usługa. Używa pliku docker-compose.yml
, aby go zdefiniować, ale tryb roju nie używa funkcji dokowania, więc może nie odpowiadać twoim konkretnym wymaganiom. Możesz uruchomić klaster trybu pojedynczego węzła, więc ta opcja jest dostępna, nawet jeśli masz tylko jeden węzeł. Ta opcja wymaga, aby każdy z twoich plików sql był dodawany jako osobna konfiguracja.docker-compose.yml
wyglądałby następująco:
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
Wtedy zamiast docker-compose up
, można uruchomić docker stack deploy -c docker-compose.yml my-db-stack
.
Udostępniłem dwa sposoby kopiowania danych z komputera lokalnego do hosta (lokalnego lub zdalnego). Zobacz tutaj http://stackoverflow.com/a/39348811/1556338 Ogólnie rzecz biorąc, chcesz zachować swoje dane z dala od obrazu. To sprawia, że twój obraz może być ponownie użyty w różnych środowiskach (dev/testing/prod, clientA, clientB, itp.). – Alkaline
Tak, 'docker cp' będzie działał, ale nie jako część funkcji docker-compose, to oddzielny krok. Byłoby fajniej nie zawijać dokera-składu w skrypcie powłoki tylko po to, aby to osiągnąć. –
Niestety funkcja tworzenia doków jest ograniczona. Ponieważ twoje użycie staje się bardziej szczegółowe, nie będziesz mógł uciec przy użyciu skryptów powłoki dla niektórych rzeczy. Kompozycja nie działa nawet w nowym trybie rój. – Alkaline