การคัดลอกไฟล์ไปยังคอนเทนเนอร์ด้วย Docker Compose


94

ฉันมีDockerfileที่ที่ฉันคัดลอกไดเร็กทอรีที่มีอยู่ (พร้อมเนื้อหา) ไปยังคอนเทนเนอร์ซึ่งใช้งานได้ดี:

Dockerfile

FROM php:7.0-apache
COPY Frontend/ /var/www/html/aw3somevideo/
COPY Frontend/ /var/www/html/

RUN ls -al /var/www/html
RUN chown -R www-data:www-data /var/www/html 
RUN chmod -R 755 /var/www/html 

ภาพหน้าจอของรายชื่อไดเร็กทอรีกับผู้บริหารนักเทียบท่า

แต่เมื่อฉันใช้docker-compose.ymlไฟล์มีเพียงไดเร็กทอรีaw3somevideoและภายในaw3somevideoไม่มีอะไรเลย

นักเทียบท่า - compose.yml :

 php:
    build: php/
    volumes:
      - ./Frontend/ :/var/www/html/
      - ./Frontend/index.php :/var/www/html/
    ports:
      - 8100:80

ภาพหน้าจอของรายการไดเรกทอรีว่าง

บางทีฉันอาจไม่เข้าใจการทำงานของvolumesและในกรณีนี้โปรดบอกวิธีคัดลอกไฟล์ที่มีอยู่ไปยังคอนเทนเนอร์ผ่านdocker-compose.ymlไฟล์


4
ลบvolumes:ส่วนของคุณออกจากไฟล์ Docker-compose รูปภาพของคุณมีข้อมูลอยู่แล้ว ส่วนไดรฟ์ข้อมูล: เพียงแค่เขียนทับข้อมูล ย้ายไปยังรูปแบบนักเทียบท่าปัจจุบันด้วย (เวอร์ชัน 2)
Bernard

@ อัลคาไลน์ขอบคุณที่เป็นปัญหาจริงๆ แต่ทำไมวอลุ่มจึงไม่คัดลอกทั้งไดเร็กทอรี
TheDoctor

เราจะตอบกลับเป็นคำตอบเพื่อให้คุณปิดปัญหานี้
Bernard

คำตอบ:


80

ให้

    volumes:
      - /dir/on/host:/var/www/html

ถ้าไม่ได้อยู่ก็จะถูกสร้างขึ้นบนโฮสต์และเนื้อหาที่ว่างเปล่าจะถูกติดตั้งอยู่ในภาชนะบรรจุที่/dir/on/host /var/www/htmlเนื้อหาใดก็ตามที่คุณมีก่อนหน้านี้/var/www/htmlภายในคอนเทนเนอร์จะไม่สามารถเข้าถึงได้จนกว่าคุณจะยกเลิกการต่อเชื่อมไดรฟ์ข้อมูล เมาท์ใหม่ซ่อนเนื้อหาเก่า


เป็นไปได้หรือไม่ว่าด้วยเวอร์ชันนักเทียบท่าล่าสุดเนื้อหาของvar/www/html/จะไม่ถูกคัดลอกอีกต่อไป/dir/on/hostแม้ว่าจะไม่มีอยู่ มีวิธีบังคับคัดลอกข้อมูลจากภายใน Docker-container ไปยังโฮสต์เมื่อเริ่มต้นคอนเทนเนอร์ในครั้งแรกหรือไม่?
Tarator

1
@Tarator ใช่แน่นอนด้านขวามือจะไม่ถูกคัดลอกไปยังโฮสต์อีกต่อไป ฉันจะอัปเดตคำตอบ สำหรับวิธีคัดลอกเมื่อเริ่มต้นคอนเทนเนอร์คุณสามารถแทนที่คำสั่งเริ่มต้นด้วยสิ่งนี้docker run -v /dir/on/host:/hostdir php sh -c "cp -rp /var/www/html/* /hostdir && exec myapp"ได้ อย่าลืมใช้execเพื่อเรียกใช้คำสั่งสุดท้ายเพื่อกำหนด PID1 เพื่อให้แน่ใจว่า myapp ได้รับสัญญาณการยกเลิก (เช่น Ctrl-C)
Bernard

สวัสดีฉันกำลังพยายามทำสิ่งเดียวกันกับนักเทียบท่า แต่ได้รับข้อผิดพลาดโปรดดูที่ ... stackoverflow.com/questions/45573831/…
utkarsh31

Hey, เบอร์นาร์ดในคำตอบของคุณที่คุณอ้างถึง " ไม่ว่าจะเป็นด้านขวาระบุไดรฟ์ที่มีชื่อเหมือน myvolume หรือเส้นทางในพื้นที่เป็น" คุณไม่ได้หมายถึง "มือซ้าย" ที่นั่นเพราะนั่นคือจุดที่หนึ่งกำหนดไดรฟ์ข้อมูลหรือเส้นทางโฮสต์ซึ่งจะถูกแมปกับตำแหน่งคอนเทนเนอร์บน rhs? ฉันรู้ว่าคุณกำลังพูดถึงวิธีที่ Docker สามารถจัดการการคัดลอกไฟล์ระหว่างซ้ายและขวาและการเปลี่ยนแปลง
charlie arehart

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