2017-06-23 17 views
5

Burada benzer sorular var (docker-compose volumes_from equivalent with version 3, How to replace volumes_from in docker-composer v3) ama soruya cevap verdiklerini sanmıyorum (ya da en azından cevabın sorunu nasıl çözdüğünü anlamıyorum). Öyleyse tekrar sormaya çalışalım, özellikle de.Docker Compose v3'teki volumes_from eşdeğeri

version: '2' 
services: 
    full-tests: 
    volumes: 
     - ..:/opt/project 
     - ../../../ext-libs:/opt/ext-libs 
     - ./third-mapping:/opt/third 

    unit-tests: 
    volumes_from: full-tests 

nokta hacimlerinin seti kez tanımlanır ve kolayca yeniden kullanabilirsiniz bu onları volumes_from kullanıyor:

bu v2 liman işçisi-compose.yml var.

Bunu v3'te nasıl yeniden yazarsınız?

+0

Bazı ipuçları: https://github.com/moby/moby/issues/19990 – Borek

+0

uygun v2 şekilde eşyalarını, –

+0

@EugenMayer güncellenmiş bir v1 yol yazınız. – Borek

cevap

6

Sorunuzu cevaplamak için - v3 ile imkansız - aşağıdaki bölüme bakın. v3 ardıl olarak kullanılmayacaktır (aynı zamanda docker tarafından resmi bir beyanname), “sürü vakalarında” kullanılacaktır.

Bununla birlikte, yapmanız gereken, adlandırılmış birimleri kullanmaktır.

Sen 3.2 tanıtılan uzun sözdizimi kullanılarak bu kolaylaştırabilirsiniz bu

docker volume create --name volume1 -o type=none -o device=/home/$USER/projects/01 -o o=bind 

gibi konak-bağlama hacimleri ile birleştirebilirsiniz: https://docs.docker.com/compose/compose-file/#long-syntax-2 böylece de ana bilgisayarda adlandırılmış hacmi + bağlama tanımlayabilirsiniz liman işçisi-oluşturma dosya örnek:

services: 
    full-tests: 
    volumes:  
     - type: volume 
     source: ../ 
     target: /opt/project 
     - type: volume 
     source: ../../../ext-libs 
     target: /opt/ext-libs 

veya kısaca size olduğu gibi

services: 
    full-tests: 
    volumes:  
     - ../:/opt/project 
     - ../../../ext-libs:/opt/ext-libs 

Ne yapamazsınız, uzun-sözdizimini en üst düzey "birimler" tanımının altına koyarak, bu birime bir ad verin ve hizmetlerde birimler bölümünde yeniden kullanın - bu mümkün değil. Bunu yapmak için, bir

volumes: 
    project: 
    external: true 
    third-party: 
    external: true 

kullanacağı Sonra

yukarıda ana hatlarıyla gibi bir bağlama seçeneği ile bu birimleri oluşturmak için cli üzerinde sözdizimi "liman işçisi hacmi yaratmak" kullanmak ancak olsun asla ne volumes_from sizin için burada yaptığını

v3 v2, onun alternatif bir halefi olmadığından v3 içinde volumes_from hiçbir eşdeğer yoktur

- yorumumu ve kaynakları burada https://github.com/rancher/rancher/issues/3316#issuecomment-310889283

01 bakın

Özetle - volumes_from ve birimlerde volumes_from durumunda bir çakışma var, yanlış alanda yanlış yoldan/yanlış yoldan kullanıldı.

a) veri genelinde yığın yükseltmeleri (aşağı + yukarı), adlı kıracağı hacimleri kalıcı olmasını istiyorsanız - ve 2+ hizmetler bu paylaşmaya ihtiyacı varsa, şimdi, sadece volumes: kullanarak bu adlandırılmış birimini bağlamaya.

b) olsa değil verileri (yığın yükseltmeleri üzerinde devam etmek istiyorum yaparsanız örneğin kaynak kodu ve görüntü aslında bir olağan uygulamasında bir gibi bir yükseltmeleri bu) içerdiğinden + httpd/vekil senaryo, sen bunun için bir anon hacmi oluşturacaktır Dockerfile'da /var/wwwVolume /var/www kullanarak ve daha sonra httpd hizmetine yüklemek için volumes_from kullanın.b ile


ana nokta, yığın yükseltmeleri üzerinde, anon hacmi (anon kapları kaldırır aşağı liman işçisi-oluşturmak `fakat olanları adında değil) çıkarılır ve haliyle yükseltme, sahip işler olacak olan yeni bir kod temeli kodu o olacak bindirme "taze" görüntü üzerinde kod temeli/yeni adlandırılmış hacmine özellikte olduğu ve size ilk yükseltme üzerinde büyük sürpriz verecektir adlı hacimleri ile aynı yapmaya çalışıyor

konteyner, böylece yükseltmeden sonra eski kod tabanı üzerinde çalışacaksınız.

+0

Teşekkürler, şimdiye kadar en iyi cevap. Yani uzun sözdizimi ile, ben 'cihaz' haritalama ile ad hacimleri ile benim v2 örneğine yakın almak oldukça olasıdır? İki servisim arasında hala yineleme olacaktı, ama v3'ün bu kopyalamayı bana neden zorladığına dair bir sebep var, emin değilim. – Borek

+0

evet, bu sınırlamanın etrafından dolaşmanın bir yolu yok, ayrıca buradaki yorumumu https://github.com/docker/compose/issues/4693#issuecomment-310892561 de görüyorum ... ama sizin usecase'inin kötüye kullanımlardan biri olduğunu düşünüyorum durmak istedi (ve bunu doğru buluyorum) - sert duygular yok. Ve evet, bir sürü arasında yayılan şeyler hakkında düşündüğünüzde bir neden var, ana bilgisayar-mounts az ya da bunun için engelleyici vardır - onun sadece bir ana bilgisayarda kullanılabilir, hepsi değil :) –

+0

Elbette, kullanım durumum dockerized bir geliştirme ortamı ölçeklenebilir bir çalışma zamanı değil. Bu yüzden çok benzer "hizmetlerim" olacak (pratikte bir kez testlerin koşucuları) ve bunların her birine, birkaç yerel klasörün haritasını çıkarmalıyım. (Ana bilgisayar eşlemesi, hata ayıklama için önemlidir.) Muhtemelen docker-compose için birincil kullanım durumu değil ama v2 bunu destekledi. O versiyona sadık kalacağım, umarım beğenmedim ya da sadece farklıysa (v3 ardıl değil alternatif olarak). – Borek

-1

Docker-compose sürüm 3 ile birlikte çalışıyorum. Temel olarak "volumes_from" ifadesini değiştirmek ve global bir "hacim" beyanı oluşturmak zorunda kaldı. Burada

version: "3" 
services: 
    unison: 
    container_name: xxx_unison 
    image: onnimonni/unison 
    environment: 
     - UNISON_DIR=/var/www/$DOCKER_WEB_DOMAIN/htdocs/ 
     - UNISON_USER=www-data 
     - UNISON_UID=1000 
     - UNISON_GID=1001  
    volumes: 
     - unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/ 
    networks: 
     - frontend  
    ports: 
     - "5000:5000"  
    database: 
    container_name: xxx_database 
    image: percona 
    depends_on: 
     - unison 
    environment: 
     - MYSQL_ROOT_PASSWORD=xxx 
     - MYSQL_DATABASE=xxx # Assign a database to be created on container first load 
    volumes: 
     - ./mysql/import:/docker-entrypoint-initdb.d 
     - ./mysql/data/:/var/lib/mysql/ 
     - ./logs:/var/log/mysql 
     - ./mysql/conf:/etc/mysql/conf.d   
    ports: 
     - "3306:3306" 
    networks: 
     - frontend 
    web: 
    container_name: xxx_web 
    image: ubuntu 
    depends_on: 
     - unison  
    volumes: 
     - ./nginx/ssl/:/etc/nginx/ssl/ 
     - ./logs/:/var/log/nginx 
     - ./shell/run.sh:/run.sh 
     - unison_file:/var/www/$DOCKER_WEB_DOMAIN/htdocs/ 
    ports: 
     - "80:80" 
     - "443:443" 
    networks: 
     - frontend 
    env_file: 
     - ./.env  
networks: 
    frontend: 
volumes: 
    unison_file: 
İlgili konular