การจัดการไฟล์ใน image

Docker เบื้องต้น

Tim Sangster

Software Engineer @ DataCamp

การ COPY ไฟล์เข้า image

คำสั่ง COPY ใช้คัดลอกไฟล์จากเครื่องของเราไปยัง image ที่กำลังสร้าง:

COPY <src-path-on-host> <dest-path-on-image>
COPY /projects/pipeline_v3/pipeline.py /app/pipeline.py
docker build -t pipeline:v3 .
...
[4/4] COPY ./projects/pipeline_v3/pipeline.py /app/pipeline.py

หากไม่ระบุชื่อไฟล์ที่ปลายทาง จะใช้ชื่อไฟล์ต้นทางเดิม:

COPY /projects/pipeline_v3/pipeline.py /app/
Docker เบื้องต้น

การ COPY โฟลเดอร์

หากไม่ระบุชื่อไฟล์ใน src-path ระบบจะคัดลอกไฟล์ทั้งหมดในโฟลเดอร์นั้น

COPY <src-folder> <dest-folder>
COPY /projects/pipeline_v3/ /app/

COPY /projects/pipeline_v3/ /app/ จะคัดลอกทุกอย่างใน pipeline_v3/:

/projects/
    pipeline_v3/
        pipeline.py
        requirements.txt
        tests/
            test_pipeline.py
Docker เบื้องต้น

การคัดลอกไฟล์จาก directory ระดับบน

/init.py
/projects/
    Dockerfile
    pipeline_v3/
        pipeline.py

หาก working directory ปัจจุบันอยู่ในโฟลเดอร์ projects/

ไม่สามารถคัดลอก init.py เข้า image ได้

docker build -t pipeline:v3 .
 => ERROR [4/4] COPY ../init.py /     0.0s
failed to compute cache key: "../init.py" not found: not found
Docker เบื้องต้น

การดาวน์โหลดไฟล์

แทนที่จะคัดลอกไฟล์จาก directory ในเครื่อง มักจะดาวน์โหลดไฟล์ระหว่างการสร้าง image:

  • ดาวน์โหลดไฟล์

RUN curl <file-url> -o <destination>

  • แตกไฟล์

RUN unzip <dest-folder>/<filename>.zip

  • ลบไฟล์ zip ต้นทาง

RUN rm <copy_directory>/<filename>.zip

Docker เบื้องต้น

การดาวน์โหลดไฟล์อย่างมีประสิทธิภาพ

  • ทุกคำสั่งที่ดาวน์โหลดไฟล์จะเพิ่มขนาดรวมของ image
  • แม้ไฟล์เหล่านั้นจะถูกลบในภายหลังก็ตาม
  • วิธีแก้คือดาวน์โหลด แตกไฟล์ และลบไฟล์ในคำสั่งเดียว
RUN curl <file_download_url> -o <destination_directory>/<filename>.zip \
&& unzip <destination_directory>/<filename>.zip -d <unzipped-directory> \
&& rm <destination_directory>/<filename>.zip
Docker เบื้องต้น

สรุป

การใช้งาน คำสั่งใน Dockerfile
คัดลอกไฟล์จากเครื่องเข้า image COPY <src-path-on-host> <dest-path-on-image>
คัดลอกโฟลเดอร์จากเครื่องเข้า image COPY <src-folder> <dest-folder>
ไม่สามารถคัดลอกจาก directory ระดับบนของ Dockerfile ได้ COPY ../<file-in-parent-directory> /

รักษาขนาด image ให้เล็กด้วยการดาวน์โหลด แตกไฟล์ และลบไฟล์ในคำสั่ง RUN เดียว:

RUN curl <file_download_url> -o <destination_directory> \
&& unzip <destination_directory>/<filename>.zip -d <unzipped-directory> \
&& rm <destination_directory>/<filename>.zip
Docker เบื้องต้น

มาฝึกกันเถอะ!

Docker เบื้องต้น

Preparing Video For Download...