2016-09-08 9 views
7

Nie jestem pewien, czy coś oczywistego wymyka mi się, czy nie jest to możliwe, ale staram się skomponować cały stos aplikacji z obrazami z koncentratora dokowanego.Dodawanie plików do standardowych obrazów przy użyciu dokowania-komponowania

Jednym z nich jest mysql i obsługuje dodawanie niestandardowych plików konfiguracyjnych poprzez woluminy oraz uruchamianie plików .sql z zamontowanego katalogu.

Ale mam te pliki na komputerze, na którym uruchamiam dokowanie, a nie na hoście. Czy nie ma możliwości określenia plików z komputera lokalnego do skopiowania do kontenera przed uruchomieniem go entrypoint/cmd? Czy naprawdę muszę tworzyć lokalne obrazy wszystkiego tylko dla tej sprawy?

+0

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

+0

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

+0

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

Odpowiedz

9

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.

3

To jak to robię z tomów:

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

To nie działa, gdy shell_scripts znajduje się na innym hoście ze zdalnego serwera dokowanego. – BMitch

0

W niedawnej aktualizacji na to pytanie: z roju Döcker hostowane na Amazon, na przykład, można zdefiniować objętość, która może być udostępniane przez usługi i jest dostępne we wszystkich węzłach roju (przy użyciu sterownika cloudstor, który z kolei ma AWS EFS będący podstawą trwałości).

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

Moja reputacja jest zbyt niska, aby skomentować dlatego tworzę nową odpowiedź, Adam Spence „s odpowiedź brakuje«-»dla opcji tomach” tomy przyczyna musi być tablicą, jak poniżej:

+1

Nadal możesz sugerować zmiany nawet przy niskiej reputacji. Zobacz opcję "popraw tę odpowiedź" pod każdą odpowiedzią. – BMitch

Powiązane problemy