Docker Compose - Berbagi volume bernama antara beberapa kontainer

110

Saya menggunakan docker-compose dan v3. Saya mencoba memasang volume di buruh pelabuhan:

./appdata:/appdata

Saya ingin ini sebagai volume dan kemudian mereferensikan volume itu dari beberapa wadah. The Volume konfigurasi referensi hanya menunjukkan data-volume:sebagai volume bernama, dengan tidak ada nilai, sehingga tidak terlihat seperti di atas.

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

Ini memberi saya:

GALAT: Dalam file './docker-compose.yml', volume 'app-volume' harus berupa pemetaan, bukan string.

Jelas saya tahu saya perlu mengubah pasangan volumeskunci / nilai, tetapi saya tidak yakin bagaimana cara mengubahnya sehingga saya dapat berbagi volume antar layanan.

Saya juga telah memeriksa volumes_fromtetapi ini secara efektif hanya memungkinkan warisan dari penampung lain. Saya telah melihat seseorang menggunakan volumes_fromdi wadah lain yang berisi pemetaan yang mereka inginkan, tetapi dengan command: truemengatur agar wadah tidak pernah benar-benar berjalan, yang bagi saya hanya tampak seperti retasan.

Bagaimana saya bisa melakukan ini?


Catatan, saya tidak memiliki kerja sebagai berikut:

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

Tapi itu hanya duplikasi dan saya berharap volume bernama dapat membantu saya menghindari :-)

Jimbo
sumber
Anda dapat menemukan jawabannya di jawaban ini: stackoverflow.com/a/49920624
Isen Ng

Jawaban:

145

Volume yang disebutkan dapat dibagikan di seluruh kontainer dengan cara berikut:

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: 

Berikut adalah contoh konfigurasi yang saya gunakan untuk pemahaman yang lebih baik. Saya mengekspos file statis yang dihasilkan dari webpenampung saya ke volume bernama static-contentyang kemudian dibaca dan disajikan oleh nginxpenampung:

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:
Kannaj
sumber
79
Di mana Anda menyetel lokasi static_contentpada filesystem host?
Travis Bear
10
Spasi kosong app-volume: location_in_the_containersalah.
hasufell
5
Bagaimana jika /usr/src/appdi dalam nginxcontainer dan /usr/src/app/publicdi webcontainer sama-sama mendapatkan konten original, mana yang akan digunakan dan mengapa?
jallen0927
2
@TravisBear untuk kasus penggunaan ini (berbagi data antar kontainer) tidak perlu ada di host. Contoh dengan data statis sangat bagus - Anda mengeksekusi collectstaticdalam satu wadah dan ingin hasilnya tersedia di wadah lain, tetapi Anda tidak peduli dengan folder host
The Godfather
7
Pertanyaan @Kannaj TravisBear adalah pertanyaan yang mengidentifikasi dengan benar masalah yang menurut saya paling membingungkan. Bagaimana di file compose Anda dapat menentukan dari mana volume bernama bersumber? Saya tidak ingin menyerahkannya ke mesin buruh pelabuhan untuk menentukan di mana menyimpan nama volume pada host, saya ingin menentukan jalur.
Ben Collins
34

Ini menyelesaikannya tanpa menggunakan volume bernama:

      volumes:
          - ./appdata:/appdata

Jadi, ini terlihat seperti:

services:

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

  php:
      build: ./php/
      expose:
          - 9000
      volumes:
          - ./appdata:/appdata
Robert
sumber
4
Ah, waktu yang bagus! Saya melakukan ini di atas (lihat perubahan saya). Namun, tampaknya kami masih menduplikasi pemetaan tersebut. Jika saya menggunakan ini lebih dari 3 kontainer, itu menjadi besar. Bisakah kita menggunakan wadah bernama untuk menghindari duplikasi ini?
Jimbo
Masalahnya adalah bahwa volume bernama bukan hanya tentang sintaks dan kode yang jelas. Ini akan membuat volume di dalam direktori instalasi data buruh pelabuhan dan Anda tidak akan memiliki file lokal Anda di sana (./appdata). Apakah itu berguna untuk Anda?
Robert
2
Saya pasti membutuhkan ./appdata, itulah yang saya coba lakukan. Tinggalkan jawaban ini di sini :) +1
Jimbo
2
Apa yang terjadi jika saya memiliki dua penampung dari gambar yang sama, mengunggah file (melalui layanan unggah file) dalam satu penampung, akan tersedia di penampung yang lain? jika tidak, bagaimana saya bisa melakukan itu?
magnoz
1

Volume buruh pelabuhan bernama telah dihapus mulai dari versi docker-compose 3.

Namun, Anda dapat menggunakan bidang ekstensi untuk menghindari sumber volume duplikat dan mencegah diri Anda dari kesalahan ketik di masa mendatang:

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

CATATAN: Fitur tersebut tersedia mulai dari format file versi 3.4.

Andriy Ivaneyko
sumber
Jika * services-volume hanyalah penunjuk ke nilai yang ditetapkan di atas, ini tampak luar biasa ... Saya harus mencobanya.
Jimbo
@Jimbo ya, itu, juga perhatikan bahwa versi file docker-compose adalah 3.4+
Andriy Ivaneyko
2
Volume bernama, alias volumesbidang tingkat atas , tampaknya masih menjadi hal di v3docker-compose .
Alex Povel