Docker Compose ควรจะดูไวยากรณ์“ เล่ม” ของรุ่น 2 อย่างไร


43

ด้วยDocker Compose v1.6.0 + ขณะนี้มีไวยากรณ์ไฟล์ใหม่ / เวอร์ชัน 2 สำหรับdocker-compose.ymlไฟล์ volumesรวมถึงการเปลี่ยนแปลงที่สำคัญระดับบนสุดที่แยกต่างหากชื่อ สิ่งนี้อนุญาตให้ "รวมศูนย์" คำจำกัดความของปริมาณไว้ในที่เดียว

สิ่งที่ฉันพยายามทำคือตั้งชื่อโวลุ่มในนั้นและมีการอ้างอิงโวลุ่มเดียวหลายพา ธ บนโลคัลโฮสต์ดิสก์ของฉัน ต่อไปนี้เป็นตัวอย่างการโยนข้อยกเว้นTracebackที่ลงท้ายด้วย

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

ตัวอย่าง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
  … ?

จนถึงตอนนี้ฉันได้อ่านการอ้างอิงการกำหนดค่าระดับเสียงของDocker Compose docs master-branch , ตัวอ้างอิงDocker Compose docs Volume / Volume-Driver และดูตัวอย่าง GitHubเพื่อค้นหาไวยากรณ์ที่ถูกต้องตามที่คาดไว้ ดูเหมือนว่าไม่มีใครใช้งานแล้ว (GitHub) และเอกสารยังไม่สมบูรณ์ (docker.com) ฉันพยายามสร้างโวลุ่มแยกต่างหากserviceและอ้างอิงในvolumesแต่ก็ใช้งานไม่ได้เช่นกัน ความคิดเกี่ยวกับวิธีการไวยากรณ์นี้ควรมีลักษณะอย่างไร

คำตอบ:


40

จุดประสงค์ของvolumesกุญแจ

มันจะมีการสร้างปริมาณการตั้งชื่อ

หากคุณไม่ได้ใช้งานคุณจะพบว่าคุณมีค่าแฮชจำนวนมากสำหรับโวลุ่มของคุณ ตัวอย่าง:

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

ด้วยโวลุ่มที่มีชื่อคุณจะได้รับสิ่งต่อไปนี้:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

วิธีสร้างโวลุ่มที่มีชื่อ

docker-compose.ymlไวยากรณ์:

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

บางสิ่งที่เหมือนข้างต้นแสดงให้เห็นปริมาณที่มีชื่อ

วิธีลบโวลุ่มเป็นกลุ่ม

เมื่อคุณมีกลุ่มของแฮ็ชมันอาจยากที่จะทำความสะอาด นี่คือหนึ่งซับ:

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

แก้ไข:เนื่องจาก @ArthurTacca ชี้ให้เห็นในความคิดเห็นมีวิธีการจดจำที่ง่ายกว่า:

docker volume rm $(docker volume ls -q)

วิธีรับรายละเอียดเกี่ยวกับหนังสือที่มีชื่อ

ตอนนี้คุณไม่ต้องค้นหาแฮชอีกต่อไปคุณสามารถไปต่อและเรียกพวกเขาด้วยชื่อ …ของพวกเขา  :

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:คุณอาจต้องการให้docker-compose downบริการของคุณเริ่มต้นใหม่ก่อนที่จะสร้างโวลุ่ม

ในกรณีที่คุณกำลังใช้Boot2Docker / หางเครื่องคุณจะต้องdocker-machine sshและsudo -iก่อนที่จะทำls -la /mnt/…ของปริมาณของ - คุณเครื่องโฮสต์เป็น VM จัดเตรียมโดยเทียบท่าเครื่อง


1
คำตอบที่ดีมาก ไชโย ล้างข้อมูลจำนวนมากกลับมาอีกครั้งเพื่อค้นหาโวลุ่มที่ประกอบด้วยนักเขียน
Derek Adair

คุณพบสิ่งเหล่านี้จากที่ไหน ดูเหมือนมากกว่าเอกสารนักเทียบท่าหรือไม่
Derek Adair

1
@DerekAdair ขอบคุณ แต่อย่างที่คุณสามารถอ่านได้ในสถิติทางด้านซ้ายบนคำตอบนี้มีการอ้างอิงที่ดีในหน้าผลลัพธ์ของเครื่องมือค้นหาของ Google ในหัวข้อนี้
ไกเซอร์

1
แทนที่จะ$(docker volume ls |awk '{print $2}')ใช้งาน$(docker volume ls -q)ง่ายกว่านี้ไม่เพียงพิมพ์ "VOLUME" ในบรรทัดแรกเท่านั้น
Arthur Tacca

2
สิ่งนี้ไม่ถูกต้อง สิ่งนี้ไม่ได้ทำในสิ่งที่ทำให้ดูเหมือน volumes_fromคือการรับช่วงรายการจากคอนเทนเนอร์อื่น ในการใช้วอลลุ่มที่มีชื่อคุณใช้ไวยากรณ์ระดับบริการ- NAME:DESTและตั้งค่าพา ธ ในvolumesคีย์ระดับบนสุด สิ่งที่ตัวอย่างนี้ทำ (ในขณะที่เขียนนี้) ทำให้ไดรฟ์ข้อมูลมาตรฐานนอกเหนือจากไดรฟ์ข้อมูลที่กำหนดชื่อและไม่ได้ใช้ไดรฟ์ข้อมูลที่ระบุชื่อ
trevorj

13

วิธีที่ฉันเข้าใจคุณสามารถใช้volumes:ส่วนสากลเพื่อ

  • กำหนดชื่อปริมาณ
  • ทำให้ไดรฟ์ข้อมูลที่ตั้งชื่อพร้อมใช้งานภายใต้ชื่อไดรฟ์ข้อมูลอื่น
  • ระบุไดรเวอร์และตัวเลือกไดรเวอร์สำหรับไดรฟ์ข้อมูลที่มีชื่อ

external: trueไดรฟ์ในส่วนทั่วโลกจะสร้างขึ้นโดยอัตโนมัติเว้นแต่คุณจะระบุ คุณยังจะต้องแจ้งแต่ละบริการในvolumes:ส่วนของมันว่าจะติดตั้งวอลลุ่มนั้น

นี่เป็นตัวอย่างง่ายๆ:

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

volumes:รายการส่วนกลางสำหรับprojectจะทำให้ไดรฟ์ข้อมูลที่มีชื่อprojectถูกสร้างขึ้น จากนั้นจะถูกเมาท์เหมือนกับ/barในเซอร์วิสหนึ่งและ/fooในเซอร์วิสที่สอง บริการทั้งสองแชร์ข้อมูลของโวลุ่มและสามารถอ่าน / เขียนได้

ฉันไม่คิดว่าสิ่งที่คุณพยายามจะทำนั้นเป็นไปได้ (เปลี่ยนหลายเส้นทางให้เป็นโวลุ่มเดียวและด้วยแฟล็ก r / w ที่ต่างกัน) หากเป็นไปได้ให้หาวิธีสร้างโวลุ่มที่มีชื่อด้วยคุณสมบัติเหล่านี้ด้วยวิธีการอื่นแล้วเพิ่มเป็นโวลุ่มภายนอก:

volumes:
  mymagicvolume:
    external: true

1
อัปเดตแล้ว แต่วันนี้เพิ่งพบเวลาที่จะหลีกเลี่ยงและเพิ่มข้อมูลเพิ่มเติม ขอบคุณสำหรับความช่วยเหลือของคุณ! คำถาม: ในฐานะที่เป็นคุณชื่อไดรฟ์projectแล้วอ้างอิงว่ามันเป็นproject:/barที่มีการprojectเส้นทางที่กำหนดไว้ได้จริง?
ไกเซอร์

นักแต่งเพลงจะสร้างโดยอัตโนมัติเป็นโวลุ่มที่มีชื่อภายใต้ / var / lib / นักเทียบท่า / โวลุ่ม / volumename
JamesCW

ขออภัยยังไม่เข้าใจว่านักเทียบท่าหาเส้นทางproject:นามแฝงอยู่ที่ไหน นักเทียบท่าจะรู้ได้อย่างไรว่าฉันต้องการแบ่งปันพูด./some_folder/some_subfolder/yet_another_subfolderกับone:และtwo:คอนเทนเนอร์หรือไม่
Alexander Lomia

ในกรณีนั้นมันคือ "project: <whethingpath>" ภายใต้เล่มระดับบนสุด: ส่วน
Balint Bako

5

ลองดูเวอร์ชัน 2เช่นการอ้างอิงการกำหนดค่าระดับเสียง :

ตัวอย่างของฉัน: (รุ่น 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
นี่คือสิ่งที่ฉันเชื่อมโยงในคำถามและดังนั้นจึงไม่ตอบคำถามของฉัน คุณต้องการโพสต์ตัวอย่างของวิธีการแมปไดเรกทอรีที่แตกต่างจากโฮสต์เป็นไดรฟ์ข้อมูลที่ระบุชื่อไปยังบริการหลาย ๆ
ไกเซอร์

เชื่อมโยงของฉันเป็นที่แตกต่างกันจะชี้ไปที่Version 2ส่วนของเอกสาร)
Alexus

ความผิดฉันเอง. ฉันแค่ลืมที่จะเชื่อมโยงที่หนึ่งเช่นกัน เมื่อคุณดูเนื้อหาของ YML ในคำถามคุณจะเห็นว่าฉันพยายามหลีกเลี่ยงการใช้volumesคีย์ระดับบนสุดที่แยกต่างหากซึ่งฉันไม่ได้ทำดังนั้นคำถาม สิ่งที่ฉันไม่ได้รับคือdocker-compose.ymlส่วนที่มีไวยากรณ์เวอร์ชัน 1 มีไว้เพื่ออธิบายฉัน
ไกเซอร์

5

ผมคิดว่าสิ่งที่คุณกำลังพยายามที่จะทำคือประมาณเดียวกันเท่าที่เห็นนี่ กล่าวโดยย่อ: ในปัจจุบันยังไม่สามารถสร้างวอลลุ่มที่มีชื่อซึ่งอ้างอิงถึงจุดเชื่อมต่อบนโฮสต์ คุณสามารถสร้างโวลุ่มที่มีชื่อเพื่อแชร์ข้อมูลระหว่างคอนเทนเนอร์ แต่ข้อมูลจะมีอยู่ในโวลุ่มนั้นเท่านั้นและจะหายไปเมื่อคุณลบโวลุ่ม

มีการเสนอการติดตั้งไดรฟ์ชื่อแต่น่าเสียดายที่จะไม่ถูกเพิ่มลงในแกนหลักในอนาคตอันใกล้ แต่ก็เป็นไปได้โดยใช้นักเทียบท่าปลั๊กอินชื่อท้องถิ่นยังคงมีอยู่


3
การติดตั้งไดรฟ์ข้อมูลชื่อ ตอนนี้เป็นสิ่งที่ ... ตั้งแต่ 1.11 หรือ 1.12
ไกเซอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.