Docker Compose - Adlandırılmış hacmi birden çok kapsayıcı arasında paylaşın


118

Docker-compose ve v3 kullanıyorum. Docker'da bir birim bağlamaya çalışıyorum:

./appdata:/appdata

Bunu bir hacim olarak almak ve ardından bu hacmi birden çok kaptan referans almak istiyorum. Hacim yapılandırma referans sadece gösterileri data-volume:hiçbir değere sahip bir adlandırılmış hacim olarak, yukarıdaki gibi görünmüyor böylece.

services:

    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes:
            - app-volume

    php:
        build: ./php/
        expose:
            - 9000
        volumes:
            - app-volume

volumes:
     app-volume: ./appdata:/appdata

Bu bana şunu verir:

HATA: './docker-compose.yml' dosyasında, 'app-volume' birimi bir dize değil bir eşleme olmalıdır.

Açıkçası, volumesanahtar / değer çiftini değiştirmem gerektiğini biliyorum , ancak bunu nasıl değiştireceğimi bilmiyorum, böylece servisler arasında bir hacmi paylaşabilirim.

Ayrıca kontrol ettim volumes_fromama bu etkili bir şekilde diğer kaplardan miras almaya izin veriyor. Birinin kullandığını gördümvolumes_from istediği eşlemeyi içeren başka bir kapsayıcıda , ancak command: truebu kapsayıcı hiçbir zaman çalıştırılmayacak şekilde ayarlandı, bu bana bir hack gibi görünüyor.

Bunu nasıl yapabilirim?


Not, ben do aşağıdaki çalışma var:

nginx:
    volumes:
        - ./appdata:/appdata
php:
    volumes:
        - ./appdata:/appdata

Ama bu sadece bir kopya ve adlandırılmış bir cildin kaçınmama yardımcı olabileceğini umduğum bir şey :-)


Cevabı şu cevapta bulabilirsiniz: stackoverflow.com/a/49920624
Isen Ng

Yanıtlar:


155

Adlandırılmış birimler, kapsayıcılar arasında şu şekilde paylaşılabilir:

services:
    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes:
            - app-volume:location_in_the_container

    php:
        build: ./php/
        expose:
            - 9000
        volumes:
            - app-volume:location_in_the_container

volumes:
     app-volume: 

İşte daha iyi anlamak için kullandığım bir yapılandırma örneği. webKonteynırımdan oluşturulan statik dosyaları , adı verilen static-contentve daha sonra nginxkonteyner tarafından okunan ve sunulan adlandırılmış bir birime maruz bırakıyorum :

services:
  nginx:
    container_name: nginx
    build: ./nginx/

    volumes:
      - static-content:/usr/src/app

  web:
    container_name: web
    env_file: .env
    volumes:
      - static-content:/usr/src/app/public
    environment:
      - NODE_ENV=production

    command: npm run package

volumes:
  static-content:

83
static_contentAna bilgisayar dosya sisteminde konumunu nereye ayarlarsınız ?
Travis Bear

10
İçindeki boşluk app-volume: location_in_the_containeryanlış.
hasufell

6
Ya /usr/src/appiçinde nginxkonteyner ve /usr/src/app/publiciçinde webkonteyner hem tek kullanılır ve neden olacak orijinal içerik, var mı?
jallen0927

2
@TravisBear bu kullanım senaryosu için (kapsayıcılar arasında veri paylaşımı) ana bilgisayarda gerçekten olmasına gerek yoktur. Statik verilerle örnek harika - collectstaticbir kapta çalıştırıyorsunuz ve sonuçların başka bir kapta bulunmasını istiyorsunuz, ancak ana klasörle ilgilenmiyorsunuz
The Godfather

8
@Kannaj TravisBear'ın sorusu, en kafa karıştırıcı bulduğum sorunu doğru bir şekilde tanımlayan sorudur. Oluşturma dosyasında, adlandırılmış birimin nereden kaynaklandığını nasıl belirtebilirsiniz? Adlandırılmış birimi ana bilgisayarda nerede depolayacağımı belirlemek için bunu docker motoruna bırakmak istemiyorum, bir yol belirtmek istiyorum.
Ben Collins

35

Bu, adlandırılmış ciltleri kullanmadan sorunu çözer:

      volumes:
          - ./appdata:/appdata

Yani şöyle görünüyor:

services:

  nginx:
      build: ./nginx/
      ports:
          - 80:80
      links:
          - php
      volumes:
          - ./appdata:/appdata

  php:
      build: ./php/
      expose:
          - 9000
      volumes:
          - ./appdata:/appdata

4
Ah, güzel zamanlama! Bunu yukarıda yaptım (değişikliğime bakın). Ancak, eşlemeyi hala kopyalıyoruz gibi görünüyor. Bunu 3 konteynerden fazla kullanırsam, büyüyor. Bu yinelemeyi önlemek için adlandırılmış konteynerler kullanabilir miyiz?
Jimbo

Mesele şu ki, adlandırılmış birimler yalnızca sözdizimi ve açık kodla ilgili bir şey değildir. Docker veri kurulum dizininin içinde bir birim oluşturacak ve yerel dosyalarınıza (./appdata) sahip olmayacaksınız. Yine de sizin için yararlı mı?
Robert

2
Kesinlikle ihtiyacım var, ./appdatayapmaya çalıştığım şey bu. Yine de bu cevabı burada bırakın :) +1
Jimbo

3
Aynı görüntünün iki kapsayıcısına sahipsem ne olur, bir kapta dosya yükler (dosya yükleme hizmeti aracılığıyla), diğerinde kullanılabilir olur? değilse, bunu nasıl yapabilirim?
magnoz

5

Docker adlı birimler docker-compose 3 sürümünden başlayarak kaldırıldı.

Bununla birlikte, birim kaynağının çoğaltılmasını önlemek ve gelecekteki yazım hatalarından kendinizi önlemek için uzantı alanlarını kullanabilirsiniz :

version: '3.5'

x-services-volume:
  &services-volume
  type: bind
  source: ./appdata
  target: /appdata

services:

    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes: *services-volume

    php:
        build: ./php/
        expose:
            - 9000
        # Use same way as for nginx if target override not needed.
        volumes:
            - <<: *services-volume
            target: /opt/target-override

NOT: Bu özellik, sürüm 3.4 dosya biçiminden itibaren kullanılabilir.


* Services-volume, yukarıda belirtilen değere yalnızca bir gösterici ise, bu harika görünüyor ... Bunu denemem gerekecek.
Jimbo

@Jimbo evet, docker-compose dosya sürümünün 3.4+ olacağını da unutmayın
Andriy Ivaneyko

2
Adlandırılmış birimler, diğer adıyla en üst düzey volumesalan, v3 /docker-compose .
Alex Povel

Verileri üç kapsayıcı ve bir ana bilgisayar arasında paylaşmak için tam olarak bu yaklaşımı denedim. Benim durumumda, konteynerlerdeki klasör yapıları eşittir. Bu beklendiği gibi çalışıyor gibi görünüyor. Anlamadığım şey, hangi kapsayıcı (veya ana bilgisayar) yeniden başlatırken ayrıcalıklı hakka sahip? Demek istediğim: Docker-compose yayınlarken, her bir konteynerin dahili dosya sistemi dahili olarak bir yere kaydedilir. Şimdi ana klasördeki verileri değiştirdiğimde ve yeniden bir docker-compose yaptığımda: Paylaşılan klasördeki içerik için kural nedir? Ana bilgisayardan gelen veriler dahili olarak kaydedilen verilerin üzerine yazılır mı?
and0r

1
@ and0r klasör paylaşılır, eğer birisi o klasördeki dosyayı diğer kullanıcılar için silindiğinden silerse, google drive ve gerçek kullanıcılar + paylaşılan klasörü hayal edin
Andriy Ivaneyko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.