Bagaimana seharusnya sintaksis Docker Compose versi 2 “volume” terlihat?

43

Dengan Docker Compose v1.6.0 +, sekarang ada sintaks file baru / versi 2 untuk docker-compose.ymlfile tersebut. Perubahan termasuk kunci tingkat atas yang terpisah bernama volumes. Ini memungkinkan untuk "memusatkan" definisi volume di satu tempat.

Apa yang saya coba lakukan adalah memberi nama volume di sana dan memiliki beberapa jalur referensi volume tunggal pada disk host lokal saya. Berikut ini adalah contoh, melemparkan pengecualian dengan Tracebackyang berakhir dengan

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

Contoh 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
  … ?

Sejauh ini saya membaca semua referensi konfigurasi Docker Compose masterdoc- volume Volume, Docker Compose docs Volume / Volume-Driver referensi dan melihat melalui contoh GitHub untuk menemukan sintaks yang benar yang diharapkan. Sepertinya tidak ada yang sudah menggunakan itu (GitHub) dan dokumentasinya masih jauh dari lengkap (docker.com). Saya juga mencoba membangun volume terpisah sebagai servicedan referensi volumes, tapi itu tidak berhasil juga. Adakah ide tentang bagaimana sintaksis ini seharusnya terlihat?

kaisar
sumber

Jawaban:

40

Tujuan volumeskuncinya

Itu ada untuk membuat volume bernama .

Jika Anda tidak menggunakannya, maka Anda akan menemukan diri Anda dengan banyak nilai hash untuk volume Anda. Contoh:

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

Dengan volume bernama, Anda mendapatkan sesuatu seperti berikut:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Cara membuat volume bernama

The docker-compose.ymlsintaks adalah:

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

Ini sesuatu seperti di atas ditunjukkan volume bernama.

Cara menghapus volume secara massal

Ketika Anda memiliki banyak hash, mungkin sulit untuk membersihkannya. Inilah satu kalimat:

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

Sunting: Seperti yang ditunjukkan @ArthurTacca di komentar, ada cara yang lebih mudah diingat:

docker volume rm $(docker volume ls -q)

Cara mendapatkan detail tentang volume bernama

Sekarang Anda tidak perlu mencari hash lagi, Anda bisa menggunakannya dan memanggil mereka dengan…  nama:

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: Anda mungkin ingin docker-compose downlayanan Anda mendapatkan awal yang baru sebelum membuat volume.

Jika Anda menggunakan Boot2Docker / Docker Machine , Anda harus docker-machine sshdan sudo -isebelum melakukan ls -la /mnt/…volume itu - mesin host Anda adalah VM yang disediakan oleh Docker Machine .

kaisar
sumber
1
jawaban yang sangat bagus tepuk tangan. Banyak dibersihkan kembali untuk menemukan volume menulis-docker baru.
Derek Adair
Di mana Anda menemukan ini? tampaknya jauh lebih banyak daripada dok buruh pelabuhan?
Derek Adair
1
@DerekAdair Terima kasih, tetapi karena Anda dapat membaca statistik di kiri atas, jawaban ini dirujuk dengan baik di halaman hasil mesin pencari Google pada topik ini.
kaiser
1
Alih-alih $(docker volume ls |awk '{print $2}')Anda dapat menggunakan $(docker volume ls -q)Tidak hanya ini sederhana, tidak mencetak "VOLUME" pada baris pertama.
Arthur Tacca
2
Ini tidak benar; ini tidak melakukan apa yang membuatnya tampak seperti itu. volumes_fromadalah mewarisi daftar volume dari wadah lain. Untuk menggunakan volume bernama, Anda menggunakan sintaks tingkat layanan - NAME:DEST, dan mengatur lintasan di volumeskunci tingkat atas . Apa yang dilakukan contoh ini (pada saat penulisan ini) adalah membuat volume standar selain volume bernama, dan volume bernama tidak digunakan.
trevorj
13

Cara saya memahaminya, Anda dapat menggunakan bagian global volumes:untuk

  • tentukan nama volume
  • menyediakan volume bernama dengan nama volume berbeda
  • tentukan driver dan opsi driver untuk volume bernama

Volume di bagian global akan dibuat secara otomatis kecuali Anda tentukan external: true. Anda masih perlu memberi tahu setiap layanan di volumes:bagian mana untuk memasang volume itu.

Berikut ini contoh yang sangat sederhana:

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

volumes:Entri global untuk projectakan menyebabkan volume bernama projectdibuat. Ini kemudian akan dipasang sebagai /bardalam layanan satu, dan seperti /foodalam layanan dua. Kedua layanan berbagi data volume dan dapat membaca / menulisnya.

Saya tidak berpikir bahwa apa yang Anda coba lakukan adalah mungkin (mengubah beberapa jalur menjadi satu volume, dan dengan r / w flag yang berbeda). Jika memungkinkan, maka mungkin dengan menemukan cara untuk membuat volume bernama dengan properti ini melalui beberapa cara lain dan kemudian menambahkannya sebagai volume eksternal:

volumes:
  mymagicvolume:
    external: true
membingungkan
sumber
1
Sudah terbalik, tetapi baru hari ini menemukan waktu untuk menyiasatinya dan menambahkan data yang diperluas. Terima kasih atas seluruh bantuan Anda! Pertanyaan: Ketika Anda menyebutkan volume projectdan rujuk sebagai project:/bar, di mana projectsebenarnya jalur didefinisikan?
kaiser
docker-compose akan secara otomatis membuatnya sebagai volume bernama di bawah / var / lib / docker / volume / volumename
JamesCW
Maaf, masih tidak mengerti dari mana buruh pelabuhan mendapatkan path untuk project:alias? Bagaimana buruh pelabuhan tahu jika saya ingin berbagi, katakan ./some_folder/some_subfolder/yet_another_subfolderkepada one:dan two:wadah?
Alexander Lomia
Dalam hal ini adalah "proyek: <apa pun jalan>" di bawah volume tingkat atas: bagian
Balint Bako
5

Lihat Versi 2 misalnya, juga referensi konfigurasi volume :

Contoh saya: (Versi 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
$ 
alexus
sumber
1
Inilah yang saya tautkan dalam pertanyaan dan karena itu tidak menjawab pertanyaan saya. Maukah Anda memposting contoh cara memetakan direktori yang berbeda dari host sebagai volume bernama ke beberapa layanan?
kaiser
link saya IS yang berbeda, ini menunjuk ke Version 2bagian dokumen)
alexus
Salahku. Saya lupa menghubungkannya juga. Ketika Anda melihat hal-hal YML dalam pertanyaan, Anda dapat melihat bahwa saya dengan jelas mencoba untuk menggunakan volumeskunci tingkat atas yang terpisah - yang tidak saya lakukan, karena itu pertanyaannya. Apa yang saya tidak dapatkan adalah apa yang docker-compose.ymlbagian dengan sintaks versi 1 dimaksudkan untuk menjelaskan saya.
kaiser
5

Saya pikir apa yang Anda coba lakukan kira-kira sama dengan yang terlihat di sini . Singkatnya: saat ini tidak memungkinkan untuk membuat volume bernama yang merujuk ke titik pemasangan pada host. Anda dapat membuat volume bernama untuk berbagi data antara kontainer, tetapi data hanya akan ada di volume itu sendiri, dan menghilang ketika Anda menghapus volume.

Volume bernama pemasangan telah diusulkan , tetapi sayangnya itu tidak akan ditambahkan ke inti dalam waktu dekat. Namun, dimungkinkan dengan menggunakan plugin buruh pelabuhan yang bernama local-persist .

Sander
sumber
3
Mounting volume bernama sekarang adalah sesuatu ... sejak 1,11 atau 1,12.
kaiser