Bagaimana seharusnya sintaks "volume" Docker Compose versi 2 terlihat?

Dengan Docker Compose v1.6. 0+, Sekarang ada sintaks file baru / Versi 2 untuk docker-compose.yml file. Perubahan termasuk kunci tingkat atas terpisah bernama volumes. Hal ini memungkinkan untuk "memusatkan" definisi volume di satu tempat.

Apa yang saya coba lakukan adalah untuk nama volume di sana dan memiliki referensi volume tunggal beberapa jalur pada disk host lokal saya. Berikut ini adalah contoh, melempar pengecualian dengan Traceback itu 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/sharemevolumes:  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 Docker Compose docs master- cabang Referensi konfigurasi Volume, yang 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 service dan referensi dalam volumes, tapi itu tidak berhasil juga. Ide tentang bagaimana sintaks ini seharusnya terlihat seperti?

Tujuan dari volumes kunci

Itu ada untuk membuat volume bernama.

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

$ docker volume ls DRIVER              VOLUME NAMElocal               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

Dengan volume bernama, Anda mendapatkan sesuatu seperti berikut:

$ docker volume lslocal               projectname_someconflocal               projectname_otherconf

Cara membuat volume bernama

The docker-compose.yml syntax adalah:

version: '2'services:    app:        container_name: app        volumes_from:            - appconf    appconf:        container_name: appconf        volumes:            - ./Docker/AppConf:/var/www/confvolumes:    appconf:networks:    front:        driver: bridge

Ini sesuatu seperti di atas ditunjukkan bernama volume.

Cara menghapus volume dalam jumlah besar

Ketika Anda memiliki banyak hash, itu bisa sangat sulit untuk dibersihkan. Berikut adalah Satu-liner:

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

Edit: 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 bahwa Anda tidak perlu mencari hash lagi, Anda dapat pergi di atasnya dan memanggil mereka dengan mereka … 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 down layanan Anda untuk mendapatkan awal yang baru sebelum membuat volume.

Jika Anda menggunakan Boot2Docker/ Mesin Docker, Anda harus docker-machine ssh dan sudo -i sebelum melakukan a ls -la /mnt/… dari volume itu – mesin host Anda adalah VM yang disediakan oleh Mesin Docker.

EDIT: Lain jawaban terkait tentang volume bernama pada SO.

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

  • tentukan nama volume
  • membuat volume bernama tersedia dengan nama volume yang berbeda
  • tentukan driver dan driver pilihan untuk volume bernama

Volume di bagian global akan dibuat secara otomatis kecuali Anda menentukan external: true. Anda masih perlu memberi tahu setiap layanan di dalamnya volumes: bagian mana untuk me-mount volume itu.

Berikut adalah contoh yang sangat sederhana:

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

Global volumes: entri untuk project akan menyebabkan volume bernama project untuk diciptakan. Kemudian akan dipasang sebagai /bar dalam pelayanan satu, dan sebagai /foo dalam pelayanan 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 bendera R/w yang berbeda). Jika itu mungkin, 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

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

Mounting bernama volume telah diusulkan, tapi sayangnya itu tidak akan ditambahkan ke inti dalam waktu dekat. Namun, dimungkinkan dengan menggunakan plugin docker bernama lokal-bertahan.

Check out 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$