2017-05-31 23 views
11

Tôi đang sử dụng docker-compose và v3. Tôi đang cố gắng để gắn kết một khối lượng trong Docker:Soạn thảo Docker - Chia sẻ khối lượng được đặt tên giữa nhiều vùng chứa

./appdata:/appdata

Tôi muốn có điều này như một khối lượng và sau đó tham khảo rằng khối lượng từ nhiều container. Chỉ volume configuration reference chỉ hiển thị data-volume: là một tập có tên, không có giá trị, vì vậy nó không giống như ở trên.

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 

này mang lại cho tôi:

ERROR: In file './docker-compose.yml', volume 'app-volume' must be a mapping not a string.

Rõ ràng là tôi biết tôi cần phải thay đổi cặp volumes chìa khóa/giá trị, nhưng tôi không chắc chắn cách để thay đổi điều này để tôi có thể chia sẻ một khối lượng giữa các dịch vụ.

Tôi cũng đã kiểm tra volumes_from nhưng điều này có hiệu quả chỉ cho phép thừa kế từ các vùng chứa khác. Tôi đã thấy ai đó sử dụng volumes_from trên một vùng chứa khác có chứa ánh xạ mà họ muốn, nhưng với command: true được đặt để vùng chứa không bao giờ thực sự chạy, điều đó đối với tôi dường như chỉ là lỗi.

Tôi làm cách nào để thực hiện việc này?


Lưu ý, tôi làm có làm việc tiếp theo:

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

Nhưng đó chỉ là sự trùng lặp và là một cái gì đó tôi hy vọng một khối lượng được đặt tên có thể giúp tôi tránh :-)

Trả lời

15

Khối lượng đặt tên có thể được chia sẻ trên container theo cách sau

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: 

heres một ví dụ cấu hình mà tôi sử dụng để hiểu rõ hơn. Tôi đang phơi bày các tập tin tĩnh tạo ra từ web container của tôi đến một khối lượng tên gọi static-content mà sau đó được đọc và phục vụ bởi các nginx chứa

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: 
+0

Nhưng có hai địa điểm tôi sử dụng trong ví dụ của tôi, một địa chỉ lưu trữ và một vùng chứa. Ban đầu nó trông như thế này: '- ./appdata:/appdata' nhưng với giải pháp của bạn, tôi chỉ có thể thấy một trong những giá trị này? – Jimbo

+0

Cả hai thùng chứa đều có thể ghi vào ổ đĩa AFAIK.vì vậy nếu bạn phơi bày một thư mục từ một trong các vùng chứa của bạn vào khối lượng được đặt tên - nó có thể được nhìn thấy và ghi đè bởi vùng chứa khác và ngược lại. Nếu nó vẫn không rõ ràng - tôi sẽ dán mã ví dụ của tôi để thử giải thích nó tốt hơn – Kannaj

+1

Nó phải là "câu trả lời đúng". –

3

Điều này giải quyết nó mà không sử dụng khối lượng được đặt tên:

 volumes: 
      - ./appdata:/appdata 

Vì vậy, nó trông giống như:

services: 

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

    php: 
     build: ./php/ 
     expose: 
      - 9000 
     volumes: 
      - ./appdata:/appdata 
+1

Ah, đẹp thời gian! Tôi đã làm điều này ở trên (xem thay đổi của tôi). Tuy nhiên, có vẻ như chúng tôi vẫn đang sao chép bản đồ. Nếu tôi sử dụng hơn 3 container, nó sẽ lớn. Chúng tôi có thể sử dụng các thùng chứa được đặt tên để tránh trùng lặp này không? – Jimbo

+0

Điều này là khối lượng được đặt tên không phải là một cái gì đó chỉ về cú pháp và mã rõ ràng. Nó sẽ tạo một ổ đĩa bên trong thư mục cài đặt dữ liệu docker và bạn sẽ không có các tệp cục bộ của bạn ở đó (./appdata). Nó có hữu ích cho bạn không? – Robert

+1

Tôi chắc chắn cần './Appdata', đó là những gì tôi đang cố gắng làm. Để lại câu trả lời này ở đây mặc dù :) +1 – Jimbo

Các vấn đề liên quan