2017-06-23 19 views
5

Có những câu hỏi tương tự ở đây (docker-compose volumes_from equivalent with version 3, How to replace volumes_from in docker-composer v3) nhưng tôi không nghĩ rằng họ trả lời câu hỏi (hoặc ít nhất tôi không hiểu câu trả lời giải quyết vấn đề như thế nào). Vì vậy, hãy để tôi cố gắng hỏi lại, rất cụ thể.Tương đương với volume_from trong Docker Compose v3

Tôi có v2 này Docker-compose.yml:

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

    unit-tests: 
    volumes_from: full-tests 

Vấn đề là rằng các thiết lập của khối lượng được định nghĩa một lần và tôi có thể dễ dàng tái sử dụng chúng bằng cách sử volumes_from.

Bạn sẽ viết lại điều này trong v3 bằng cách nào?

+0

Một số gợi ý ở đây: https://github.com/moby/moby/issues/19990 – Borek

+0

xin vui lòng viết công cụ của bạn theo một cách v2 thích hợp, không phải là một cách v1 –

+0

@EugenMayer cập nhật. – Borek

Trả lời

6

Để trả lời câu hỏi của bạn - điều không thể với v3 - xem phần bên dưới. v3 sẽ không được sử dụng như một người kế thừa (cũng là một tuyên bố chính thức bởi docker) nó sẽ được sử dụng trong "trường hợp swarm". Tuy nhiên,

tuy nhiên, những gì bạn nên làm là sử dụng khối lượng được đặt tên.

Bạn có thể kết hợp nó với khối lượng máy chủ-mount như thế này

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

Bạn có thể đơn giản hóa sử dụng này lâu cú pháp giới thiệu trong 3.2: https://docs.docker.com/compose/compose-file/#long-syntax-2 vì vậy bạn có thể xác định tên là khối lượng + bind trên host trong Docker-soạn tập tin dụ:

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

hoặc trong ngắn hạn như bạn có

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

Những gì bạn không thể làm, đặt cú pháp dài theo định nghĩa "khối lượng" cấp cao nhất để đặt tên cho tập đó và tái sử dụng nó trong phần khối lượng trong các dịch vụ - điều đó là không thể. Để làm như vậy, bạn sẽ sử dụng một

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

Và sau đó sử dụng "khối lượng Docker tạo ra" cú pháp trên cli để tạo ra những khối lượng với một lựa chọn ràng buộc, như phác thảo trên

nhưng bạn sẽ không bao giờ có được những gì volumes_from đang làm cho bạn đây


không có tương đương với volumes_from trong v3, vì v3 không phải là một người kế nhiệm của v2, một sự thay thế của nó - xin vui lòng xem nhận xét của tôi và các nguồn đây https://github.com/rancher/rancher/issues/3316#issuecomment-310889283

Để tổng hợp - volume_from và khối lượng có một chồng chéo trong trường hợp volumes_from chỉ được sử dụng sai cách/trong trường sai.

a) Nếu bạn muốn dữ liệu được tiếp tục tồn trên chồng nâng cấp (xuống + lên), bạn chọn tên khối lượng - và bây giờ, nếu 2+ dịch vụ cần phải chia sẻ này, chỉ cần gắn tên khối lượng này sử dụng volumes:.

b) Nếu bạn làm như vậy, hãy không muốn dữ liệu tồn tại lâu hơn nâng cấp ngăn xếp (ví dụ: vì mã nguồn và hình ảnh thực sự bao gồm nâng cấp) như trong một ứng dụng thông thường + httpd/proxy sẽ tạo ra một anon-volume cho ví dụ này /var/www trong Dockerfile bằng cách sử dụng Volume /var/www và sau đó sử dụng volumes_from để gắn nó trong dịch vụ httpd.


điểm chính với b là, rằng trên stack nâng cấp, khối lượng anon sẽ được gỡ bỏ (`Docker-soạn xuống loại bỏ container anon, nhưng không có tên những người thân) và do đó việc nâng cấp các công trình như mong đợi, bạn có một codebase mới

đang cố gắng để làm điều tương tự với khối lượng đặt tên sẽ cho bạn một bất ngờ rất lớn về việc nâng cấp đầu tiên, kể từ khi đang trên một khối lượng được đặt tên và rằng sẽ overlay codebase vào hình ảnh "tươi"/mới container, do đó bạn sẽ chạy trên codebase cũ sau khi nâng cấp.

+0

Cảm ơn, câu trả lời tốt nhất cho đến nay. Vì vậy, với cú pháp dài, tôi đoán nó khá có thể để có được gần với ví dụ v2 của tôi với khối lượng tên với ánh xạ 'device'? Vẫn sẽ có sự trùng lặp giữa hai dịch vụ của tôi nhưng có lẽ có một lý do tại sao v3 buộc sự trùng lặp này vào tôi, tôi không chắc chắn. – Borek

+0

vâng, không có cách nào để đi xung quanh giới hạn đó, cũng thấy bình luận của tôi ở đây https://github.com/docker/compose/issues/4693#issuecomment-310892561 ... nhưng tôi xem xét việc sử dụng chúng tôi là một trong những hành vi lạm dụng chúng muốn được dừng lại (và tôi thấy nó đúng để làm như vậy) - không có cảm giác khắc nghiệt. Và vâng, có một lý do khi bạn nghĩ đến việc truyền bá nội dung trên một đám, host-mounts ít nhiều có khả năng ngăn chặn điều đó - nó chỉ có sẵn trên một máy chủ, chứ không phải tất cả :) –

+0

Chắc chắn, trường hợp sử dụng của tôi là môi trường phát triển dockerized , không phải là thời gian chạy có thể mở rộng. Vì vậy, tôi sẽ có nhiều "dịch vụ" tương tự (một lần chạy thử nghiệm trong thực tế) và cho mỗi người trong số đó, tôi cần ánh xạ một vài thư mục cục bộ. (Lập bản đồ máy chủ là quan trọng để gỡ lỗi.) Có lẽ không phải là trường hợp sử dụng chính cho docker-compose nhưng v2 hỗ trợ điều này độc đáo. Tôi sẽ gắn bó với phiên bản đó sau đó, hy vọng nó không được chấp nhận hoặc một cái gì đó nếu nó chỉ khác nhau (v3 không phải là một người kế nhiệm nhưng thay thế). – Borek

-1

Tôi đã tạo phiên bản docker-compose 3 làm việc cùng một lúc. Về cơ bản đã phải thay thế "volumes_from" và tạo ra một tuyên bố "khối lượng" toàn cầu.

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: 
Các vấn đề liên quan