Docker Compose sürüm 2 "hacimler" sözdiziminin nasıl bakması gerekiyor?


43

İle Docker Oluştur GO v1.6.0 +, şimdilik yeni / sürüm 2 dosya sözdizimi vardır docker-compose.ymldosyası. Değişiklikler, adında ayrı bir üst düzey anahtar içeriyor volumes. Bu, hacim tanımlarını tek bir yerde "merkezileştirmeyi" sağlar.

Yapmaya çalıştığım, içerisindeki birimleri adlandırmak ve yerel ana bilgisayar diskimde tek bir birim referansı çoklu yolu kullanmak. Aşağıdaki bir örnek ile Tracebackbiter bir istisna atmak

AttributeError: 'list' object has no attribute 'items'

Örnek docker-compose.yml:

version: '2'

services:
  db:
    image: postgres
    volumes:
      - database:/var/lib/postgres/data

  php:
    image: php-fpm:5.6
    volumes:
      - phpconf:/etc/php/conf.d

  namedvolume:
    container_name: namedvolume
    build: ./Docker/Testvolume
    volumes: 
      - ./Docker/Testvolume/shareme

volumes:
  database:
    - ./Docker/Postgres/db:ro
    - ./Docker/Postgres/ini
  phpconf:
    - ./Docker/PHP-FPM/conf
  singledir: ./Docker/foo
  completemap: ./Docker/bar:/etc/service/conf.d
  - namedvolume:/etc/service/conf.d # < this was a separate attempt w/o the other keys
  … ?

Şimdiye kadar tüm Docker Compose docs master-branch Volume yapılandırma referansını, Docker Compose docs Volume / Volume-Driver referansını okudum ve beklenen doğru sözdizimini bulmak için GitHub örneklerine baktım . Görünüşe göre hiç kimse (GitHub) kullanıyor ve dokümantasyonu tamamlamaktan çok uzak (docker.com). Ayrıca ayrı bir cilt oluşturmaya serviceve ona referans vermeye çalıştım volumes, ancak bu da işe yaramadı. Bu sözdiziminin nasıl yapıldığına dair bir fikrin var mı?

Yanıtlar:


40

volumesAnahtarın amacı

Adlandırılmış birimler oluşturmak için var .

Eğer yoksa değil kullanmak, o zaman hacimleri için karma değerlerin bir grup ile bulacaksınız. Örnek:

$ docker volume ls 
DRIVER              VOLUME NAME
local               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55
local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

Adlandırılmış birimlerle, aşağıdaki gibi bir şey elde edersiniz:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Adlandırılmış birimler nasıl oluşturulur

docker-compose.ymlSözdizimi:

version: '2'

services:
    app:
        container_name: app
        volumes_from:
            - appconf
    appconf:
        container_name: appconf
        volumes:
            - ./Docker/AppConf:/var/www/conf

volumes:
    appconf:

networks:
    front:
        driver: bridge

Yukarıdaki gibi bir şey gösterilen adında ciltler.

Toplu hacimler nasıl kaldırılır

Bir demet karmaşanız olduğunda, temizlenmesi oldukça zor olabilir. İşte bir astar:

docker volume rm $(docker volume ls |awk '{print $2}')

Düzenleme: @ArthurTacca yorumlarda da belirtildiği gibi, hatırlaması kolay bir yol var:

docker volume rm $(docker volume ls -q)

Adlandırılmış bir birim hakkında ayrıntılı bilgi alma

Artık karmaları aramak zorunda kalmayacağınız için, devam edip bunları kendi adlarıyla çağırabilirsiniz  :

docker volume inspect <volume_name>

# Example:
$ docker volume inspect projectname_appconf

[
    {
        "Name": "projectname_appconf",
        "Driver": "local",
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/projectname_appconf/_data"
    }
]

Sidenote: Birimlerdocker-compose down oluşturmadan önce hizmetlerinize yeni bir başlangıç ​​yapmak isteyebilirsiniz .

Boot2Docker / Docker Makinesi kullanıyorsanız , bu birimden birinden önce docker-machine sshve yapmanız gerekir - ana makine Docker Machine tarafından sağlanan VM'dir .sudo -ils -la /mnt/…


1
çok iyi cevap şerefe. Yeni liman işçisi-oluşturma birimlerini bulmak için geri gelen çok şey temizlendi.
Derek Adair

Bunları nerede buldun? liman işçilerinden çok daha ayrıntılı görünüyor?
Derek Adair

1
@DerekAdair Teşekkürler, ancak sol üstteki istatistiklerden okuyabileceğiniz gibi, bu cevaba bu konuyla ilgili Google arama motoru sonuç sayfalarında iyi atıfta bulunulmaktadır.
kaiser

1
Yerine $(docker volume ls |awk '{print $2}')kullanabilirsiniz $(docker volume ls -q)Sadece bu basit, ilk satırda "VOLUME" yazdırmaz.
Arthur Tacca

2
Bu doğru değil; bu göründüğü gibi yapmaz. volumes_frometmektir devralan başka kaptan birimlerin listesini. Adlandırılmış bir birimi kullanmak için, hizmet düzeyi sözdizimini kullanır - NAME:DESTve yolu en üst düzey volumestuşa ayarlarsınız . Bu örneğin yaptığı şey (bunu yazarken) adlandırılmış birime ek olarak standart bir birim yapmaktır ve adlandırılmış birim basitçe kullanılmaz.
trevorj

13

Anladığım kadarıyla, küresel volumes:bölümü kullanabilirsiniz.

  • cilt adı tanımla
  • farklı bir cilt adı altında adlandırılmış bir birim kullanılabilir duruma getirme
  • adlandırılmış bir birim için sürücü ve sürücü seçeneklerini belirtin

Siz belirtmediğiniz sürece genel bölümdeki birimler otomatik olarak oluşturulur external: true. Her bir servise, volumes:bu birimin nereye monte edileceği bölümünde söylemeniz gerekecektir .

İşte çok basit bir örnek:

version: '2'
volumes:
  project:
services:
  one:
    volumes:
      - project:/bar
  two:
    volumes:
      - project:/foo

İçin global volumes:giriş, projectadlandırılmış bir birimin projectoluşturulmasına neden olur . Daha sonra birinci /barservis ve ikinci servis gibi monte edilir /foo. Her iki hizmet de birimin verilerini paylaşır ve okuyabilir / yazabilir.

Yapmaya çalıştığın şeyin mümkün olduğunu sanmıyorum (birden fazla yolu tek bir hacme ve farklı r / w bayraklarına çevirerek). Eğer bu mümkün, o zaman muhtemelen bir yol bularak bir dış hacim olarak ekleyerek sonra bazı başka yollarla bu özelliklere sahip bir adlandırılmış hacim oluşturmak ve:

volumes:
  mymagicvolume:
    external: true

1
Zaten upvoted, ama sadece bugün etrafında almak için zaman bulundu ve genişletilmiş bir veri ekledi. Yardımların için teşekkür ederim! Soru: Birime isim verir projectve sonra ona referans verirseniz project:/bar, projectyollar gerçekte nerede tanımlanır?
kaiser

docker-compose bunları otomatik olarak / var / lib / docker / hacimler / cilt adı altında belirtilen birimler olarak oluşturacaktır
JamesCW

Maalesef, docker'ın project:takma ad için nereden yol aldığını hala anlamadınız mı? Ben paylaşımına istiyorsanız nasıl liman işçisi biliyor mu, demek ./some_folder/some_subfolder/yet_another_subfolderiçin one:ve two:kapların?
Alexander Lomia,

Bu durumda en üst düzeydeki bölümlerde "proje: <whateverpath>" olur: bölüm
Balint Bako

5

Check Version 2 , örneğin aynı zamanda Hacim yapılandırma referans :

Örneğim: (Sürüm 1)

$ tail -4 docker-compose.yml 
  volumes:
    - ./etc/nginx/conf.d:/etc/nginx/conf.d:ro
    - ./var/log/nginx:/var/log/nginx:rw
    - ./var/www/html:/var/www/html:rw
$ 

1
Bu tam olarak soruyla bağlantılı olduğum şey ve bu nedenle sorumu cevaplamıyor. Farklı dizinlerin ana bilgisayardan adlandırılmış bir birim olarak birden çok hizmetle nasıl eşleştirildiğine bir örnek göndermeyi düşünür müsünüz?
kaiser

Benim bağlantı IS olarak işaret ettiği, farklı Version 2) belgesinin bölümüne
alexus

Benim hatam. Sadece bunu da ilişkilendirmeyi unuttum. Sorudaki YML konularına baktığınızda, üst düzey volumestuşunu kullanmaya çalıştığımı açıkça görebiliyorum - ki yapmadım, bu yüzden soru. Anlamadığım şey, docker-compose.ymlsürüm 1 sözdizimine sahip parçanın bana ne ifade etmesi gerektiği.
kaiser

5

Bence yapmaya çalıştığın şey, kabaca burada görülenlerle aynı . Kısacası: şu anda ana bilgisayarda bir bağlantı noktasına işaret eden adlandırılmış bir birim oluşturmak mümkün değildir. Kaplar arasında veri paylaşmak için adlandırılmış bir birim oluşturabilirsiniz, ancak veriler yalnızca birimin kendisinde bulunur ve birimi sildiğinizde kaybolur.

Adında birimler adı verilen montaj önerildi , ancak ne yazık ki yakın gelecekte çekirdeğe eklenmeyecek. Bununla birlikte, local-persist adında bir docker eklentisi kullanarak mümkündür .


3
Adlandırılmış birimlerin şimdi takılması bir şeydir … 1.11 veya 1.12'den beri.
kaiser
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.