Làm thế nào là Docker Soạn thảo phiên bản 2 khối lượng Cú pháp phải nhìn?


43

Với Docker Compose v1.6.0 +, giờ đây đã có cú pháp tệp mới / phiên bản 2 cho docker-compose.ymltệp. Những thay đổi bao gồm một khóa cấp cao nhất riêng có tên volumes. Điều này cho phép "tập trung" các định nghĩa âm lượng ở một nơi.

Những gì tôi đang cố gắng làm là đặt tên khối lượng trong đó và có một đường dẫn nhiều khối tham chiếu khối lượng duy nhất trên đĩa máy chủ cục bộ của tôi. Sau đây là một ví dụ, đưa ra một ngoại lệ Tracebackkết thúc bằng

AttributeError: 'list' object has no attribute 'items'

Ví dụ 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/shareme

volumes:
  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
  … ?

Cho đến nay tôi đọc qua tất cả các tài liệu Docker Soạn master-branch tham khảo cấu hình Volume, các Docker Soạn tài liệu Khối lượng / tài liệu tham khảo Khối lượng-Driver và nhìn qua ví dụ GitHub để tìm cú pháp chính xác được mong đợi. Có vẻ như chưa có ai sử dụng điều đó (GitHub) và tài liệu còn lâu mới hoàn thành (docker.com). Tôi cũng đã cố gắng xây dựng một khối riêng biệt servicevà tham chiếu nó volumes, nhưng nó không hoạt động tốt. Bất kỳ ý tưởng về làm thế nào để cú pháp này được cho là trông như thế nào?

Câu trả lời:


40

Mục đích của volumeschìa khóa

Nó ở đó để tạo ra khối lượng được đặt tên .

Nếu bạn không sử dụng nó, thì bạn sẽ thấy mình có một loạt các giá trị được băm cho khối lượng của bạn. Thí dụ:

$ docker volume ls 
DRIVER              VOLUME NAME
local               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55
local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

Với khối lượng được đặt tên, bạn nhận được một cái gì đó như sau:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Cách tạo khối lượng được đặt tên

Các docker-compose.ymlcú pháp là:

version: '2'

services:
    app:
        container_name: app
        volumes_from:
            - appconf
    appconf:
        container_name: appconf
        volumes:
            - ./Docker/AppConf:/var/www/conf

volumes:
    appconf:

networks:
    front:
        driver: bridge

Điều này giống như ở trên hiển thị khối lượng được đặt tên.

Làm thế nào để loại bỏ khối lượng lớn

Khi bạn có một loạt các băm, có thể khá khó để làm sạch. Đây là một lót:

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

Chỉnh sửa: Như @ArthurTacca đã chỉ ra trong các nhận xét, có một cách dễ nhớ hơn:

docker volume rm $(docker volume ls -q)

Làm thế nào để có được thông tin chi tiết về một tập được đặt tên

Bây giờ bạn không phải tìm kiếm băm nữa, bạn có thể tiếp tục và gọi chúng bằng tên của họ  :

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: Bạn có thể muốn docker-compose downcác dịch vụ của mình bắt đầu mới trước khi tạo khối lượng.

Trong trường hợp bạn đang sử dụng Boot2Docker / Docker Machine , bạn sẽ phải docker-machine sshsudo -itrước khi thực hiện một ls -la /mnt/…khối lượng đó - máy chủ của bạn là VM được cung cấp bởi Docker Machine .


1
câu trả lời rất tốt chúc mừng Dọn dẹp rất nhiều trở lại để tìm khối lượng soạn thảo docker mới.
Derek Adair

Bạn đã tìm thấy những thứ này ở đâu? có vẻ nhiều hơn nhiều so với các tài liệu docker?
Derek Adair

1
@DerekAdair Cảm ơn, nhưng khi bạn có thể đọc các số liệu thống kê ở phía trên bên trái, câu trả lời này được tham khảo rất nhiều trong các trang kết quả của công cụ tìm kiếm Google về chủ đề này.
kaiser

1
Thay vì $(docker volume ls |awk '{print $2}')bạn có thể sử dụng $(docker volume ls -q)Không chỉ đơn giản hơn, nó không in "TÍNH" trên dòng đầu tiên.
Arthur Tacca

2
Điều này LAF không đúng; điều này không làm những gì nó làm cho nó có vẻ như nó làm. volumes_fromkế thừa danh sách khối lượng từ một container khác. Để sử dụng âm lượng được đặt tên, bạn sử dụng cú pháp cấp dịch vụ - NAME:DESTvà đặt đường dẫn trong volumeskhóa cấp cao nhất . Ví dụ này làm gì (tại thời điểm viết bài này) là tạo ra một âm lượng tiêu chuẩn ngoài một âm lượng được đặt tên và âm lượng được đặt tên đơn giản là không được sử dụng.
trevorj

13

Theo cách tôi hiểu, bạn có thể sử dụng phần toàn cầu volumes:để

  • xác định tên âm lượng
  • làm cho một khối lượng được đặt tên có sẵn dưới một tên âm lượng khác
  • chỉ định tùy chọn trình điều khiển và trình điều khiển cho âm lượng được đặt tên

Các tập trong phần toàn cầu sẽ được tạo tự động trừ khi bạn chỉ định external: true. Bạn vẫn sẽ cần nói với từng dịch vụ trong volumes:phần của nó để gắn kết âm lượng đó.

Đây là một ví dụ rất đơn giản:

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

volumes:Mục nhập toàn cầu projectsẽ khiến một khối lượng được đặt tên projectđược tạo. Sau đó, nó được gắn kết như /bartrong dịch vụ một, và như /footrong dịch vụ hai. Cả hai dịch vụ đều chia sẻ dữ liệu của âm lượng và có thể đọc / ghi nó.

Tôi không nghĩ rằng những gì bạn đang cố gắng làm là có thể (biến nhiều đường dẫn thành một tập duy nhất và với các cờ r / w khác nhau). Nếu có thể, thì có lẽ bằng cách tìm cách tạo một âm lượng được đặt tên bằng các thuộc tính này thông qua một số phương tiện khác và sau đó thêm nó dưới dạng âm lượng bên ngoài:

volumes:
  mymagicvolume:
    external: true

1
Đã được nâng cấp, nhưng chỉ cần hôm nay đã có thời gian để khắc phục nó và thêm một dữ liệu mở rộng. Cảm ơn tất cả sự giúp đỡ của bạn! Câu hỏi: Khi bạn đặt tên cho âm lượng projectvà sau đó tham chiếu nó là project:/bar, projectcác đường dẫn thực sự được xác định ở đâu?
kaiser

docker-compose sẽ tự động tạo chúng dưới dạng các tập được đặt tên theo / var / lib / docker / volume / volumename
JamesCW

Xin lỗi, vẫn không hiểu nơi docker có đường dẫn cho project:bí danh? Làm thế nào để docker biết nếu tôi muốn chia sẻ, nói ./some_folder/some_subfolder/yet_another_subfoldervới one:two:container?
Alexander Lomia

Trong trường hợp đó, đó là "dự án: <anythingpath>" trong tập cấp cao nhất: phần
Balint Bako

5

Kiểm tra phiên bản 2 chẳng hạn, cũng tham khảo cấu hình âm lượng :

Ví dụ của tôi: (Phiên bản 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
$ 

1
Đây chính xác là những gì tôi liên kết trong câu hỏi và do đó không trả lời câu hỏi của tôi. Bạn có phiền khi đăng một ví dụ về cách ánh xạ các thư mục khác nhau từ máy chủ dưới dạng một khối lượng được đặt tên sang nhiều dịch vụ không?
kaiser

liên kết của tôi khác nhau, nó trỏ đến Version 2phần tài liệu)
alexus

Lỗi của tôi. Tôi chỉ đơn giản là quên liên kết đó là tốt. Khi bạn nhìn vào nội dung YML trong câu hỏi, bạn có thể thấy rằng tôi rõ ràng đã cố gắng sử dụng volumeskhóa cấp cao nhất riêng biệt - điều mà tôi đã không làm, do đó là câu hỏi. Những gì tôi không nhận được là những gì docker-compose.ymlvới cú pháp phiên bản 1 có nghĩa là để giải thích cho tôi.
kaiser

5

Tôi nghĩ những gì bạn đang cố gắng làm gần giống như đã thấy ở đây . Nói tóm lại: hiện tại không thể tạo một âm lượng được đặt tên liên quan đến điểm gắn kết trên máy chủ. Bạn có thể tạo một ổ đĩa được đặt tên để chia sẻ dữ liệu giữa các thùng chứa, nhưng dữ liệu sẽ chỉ tồn tại trong chính ổ đĩa đó và biến mất khi bạn xóa âm lượng.

Gắn kết khối lượng được đặt tên đã được đề xuất , nhưng thật không may, nó sẽ không được thêm vào cốt lõi trong tương lai gần. Tuy nhiên, có thể bằng cách sử dụng plugin docker có tên local-contin .


3
Gắn khối lượng được đặt tên bây giờ là một điều mà kể từ 1.11 hoặc 1.12.
kaiser
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.