2016-09-08 12 views
7

Eminim ki bir şey açık bir şekilde kaçarsa ya da bu mümkün değilse ancak tüm uygulama yığınlarını docker hub'ındaki görüntülerle oluşturmaya çalışıyorum.Docker-compose kullanarak standart görüntülere dosya ekleme

Bunlardan biri mysql'dir ve özel yapılandırma dosyalarını ciltler aracılığıyla ekleme ve takılı dizinden .sql dosyalarını çalıştırma özelliğini destekler.

Ancak, bu dosyaları makinede değil, docker-compose çalıştırdığım makinede var. Giriş noktası/cmd'yi çalıştırmadan önce kapsayıcıya kopyalamak için yerel makineden dosya belirtmenin bir yolu yok mu? Sadece bu dava için her şeyin yerel imajlarını oluşturmak zorunda mıyım?

+0

Verilerinizi yerel makinenizden ana bilgisayara (yerel veya uzak) kopyalamak için iki yol sağladım. Bkz. Http://stackoverflow.com/a/39348811/1556338 Genel olarak verilerinizi görüntüden uzak tutmak istiyorsunuz. Bu, görüntünüzü farklı ortamlarda (dev/test/prod, clientA, clientB, vb.) Tekrar kullanılabilir hale getirir. – Alkaline

+0

Evet, 'docker cp' çalışacak ancak docker-compose'un bir parçası olarak değil, ayrı bir adım. Bunu başarmak için docker-compose'u bir kabuk betiğine sarmamak daha güzel olurdu. –

+0

Ne yazık ki, docker hazırlığı sınırlıdır. Kullanımınız daha spesifik hale geldikçe, bazı şeyler için kabuk komut dosyası kullanarak çıkamayacaksınız. Compose, yeni swarm moduyla bile çalışmaz. – Alkaline

cevap

9

Seçenek A: Görüntünüzün içindeki dosyaları ekleyin. Bu, konfigürasyon dosyalarını görüntünüzle karıştırdığınızdan (bu sadece yapılandırmanızı değil, yalnızca ikili dosyalarınızı içermelidir), ancak dosyaları göndermek için yalnızca docker-compose kullanma gereksinimini karşıladığından, bu daha azdır.

Bu seçenek, görüntünüzü oluşturmak için docker-compose kullanılarak elde edilir ve bu yapı, derleme dizinindeki herhangi bir dosyayı uzak docker motoruna gönderir./Cmd

FROM mysql:latest 
COPY ./sql /sql 

girişnoktası değişmeyeceği:

version: '2' 

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

Ve db/Dockerfile gibi görünecektir: Sizin docker-compose.yml gibi görünecektir. Resim zaten varsa ve sql dosyalarını değiştirmeniz gerekiyorsa, docker-compose up --build'u çalıştırmanız gerekir.


Seçenek B: veri depolamak için bir birim kullanın. Bu docker-oluşturmanın içinde doğrudan yapılamaz. Ancak, görüntülerin dışından görüntülerin kapsayıcıya dahil edilmesinin tercih edilen yolu budur. Sen paketi ve bu dosyaları açmak için katran gibi bir komutla birlikte liman işçisi CLI ve giriş yönlendirmeyi kullanarak ağ üzerinden ses seviyesini doldurabilirsiniz Stdin üzerinden gönderilen: Bir komut dosyası aracılığıyla ve daha sonra aynı olduğunu olduğunu

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

Run komut dosyası, bu yapılandırmayı yeniden yüklemek için db kabını geri döndürür.


Seçenek C: ağ bağlantılı dosya sisteminin çeşit kullanın.

# 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 

Seçenek D: Eğer liman işçisi CLI çalıştıran ana bilgisayarda NFS yapılandırabilir, aşağıdaki seçeneklerden birini kullanarak uzak liman işçisi düğümden olanlar NFS hisseleri bağlanabilir Sürü modu ile dosyaları resminizdeki konfigürasyon olarak ekleyebilirsiniz. Bu, hizmetinizin çalıştığı düğümde talep üzerine gönderilmek üzere, sürünün normalde herhangi bir düğüme iletilmesi gereken yapılandırma dosyalarına izin verir. Bu, onu tanımlamak için bir docker-compose.yml dosyası kullanır, ancak sürgü modu docker-oluşturmayı kullanmaz, bu nedenle bu sizin özel gereksinimlerinize uymayabilir. Tek bir düğüm sürüsü modu kümesi çalıştırabilirsiniz, bu seçenek yalnızca tek bir düğüme sahip olsanız bile kullanılabilir. Bu seçenek, her sql dosyanızın ayrı bir yapılandırma olarak eklenmesini gerektirir.

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 

Sonra yerine docker-compose up, bir docker stack deploy -c docker-compose.yml my-db-stack kaçardım: docker-compose.yml gibi görünecektir. Bu sorunun daha yeni bir güncelleme olarak

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

Bu benim hacimli yapıyorum nasıl hizmetleri tarafından paylaşılan ve sürünün tüm düğümleri (cloudstor sürücüsünü kullanarak, hangi inat için dayanak altında yatan AWS EFS vardır) kullanılabilir.

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

Bu, shell_scripts uzak docker sunucusundan farklı bir ana bilgisayarda bulunduğunda çalışmaz. – BMitch

0

: Amazon üzerinde barındırılan bir liman işçisi sürüsü ile, örneğin, olabilen bir hacme tanımlayabilir

2

şöhretim bu nedenle yeni bir yanıt yaratıyorum, Adam Spence yorum yapmak çok düşük 'ın cevabı eksik '-' hacimleri seçenek için, çünkü hacimleri altında gibi bir dizi olması gerekir:

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

Yine de düşük bir itibarla bile düzenlemeler önerebilirsiniz. Her yanıtın altındaki "bu cevabı iyileştir" seçeneğine bakın. – BMitch

İlgili konular