15 คะแนน โดย GN⁺ 2024-01-15 | 7 ความคิดเห็น | แชร์ทาง WhatsApp

#! คืออะไร?

  • #! (ออกเสียงว่า shebang) เป็นธรรมเนียมที่ใช้บน Unix โดยหลักสำหรับภาษาสคริปต์อย่าง Python หรือ Bash
  • นี่คือการแนะนำกรณีตัวอย่างของการใช้สิ่งนี้เพื่อแพ็กเกจวิธีการแจกจ่ายแอปพลิเคชันแบบข้ามแพลตฟอร์มและรองรับหลายลินุกซ์ดิสโทรให้อยู่ในไฟล์เดียว
  • ตัวอย่าง Dockerfile ประกอบเซิร์ฟเวอร์แบบ full-stack ทั้งแบ็กเอนด์ ฐานข้อมูล และ UI ไว้ครบในไฟล์เดียว
  • คล้ายกับ Cosmopolitan Libc แต่มีไว้เพื่อการแพ็กเกจแอปพลิเคชัน

ทำไมถึงใช้?

  • ทำไมจะไม่ใช้ล่ะ?

ปลอดภัยไหม?

  • อาจจะไม่

ควรใช้ไหม?

  • ถ้าต้องการก็ใช้ได้

ประสิทธิภาพดีไหม?

  • เป็นไปได้

ดูแลรักษาได้ไหม?

  • ไม่

ใช้งานได้จริงไหม?

  • ใช่

รันอย่างไร?

  • สามารถรันได้ด้วยคำสั่งต่อไปนี้: chmod +x ./Dockerfile ./Dockerfile
  • จากนั้นเข้าไปที่ http://127.0.0.1:8080

ความเห็นของ GN⁺

  • บทความนี้แนะนำวิธีที่แปลกใหม่ในการแพ็กเกจเซิร์ฟเวอร์แบบ full-stack ด้วย Dockerfile เพียงไฟล์เดียวโดยใช้ #! (shebang)
  • ช่วยกระตุ้นความอยากรู้อยากเห็นทางเทคนิค และนำเสนอแนวทางใหม่ต่อวิธีการ deploy แอปพลิเคชันแบบดั้งเดิม
  • แม้ว่าวิธีนี้จะไม่แนะนำในแง่การดูแลรักษาและความเสถียร แต่ก็อาจเป็นทางเลือกที่น่าสนใจสำหรับนักพัฒนาที่สนใจโปรเจกต์แนวทดลองและนวัตกรรม

7 ความคิดเห็น

 
minhoryang 2024-01-17

หากต้องการใช้ heredoc อย่าง <<EOF จำเป็นต้องใส่ # syntax = docker/dockerfile:1.4.0 ไว้ด้านบนสุดของ Dockerfile และที่น่าประหลาดใจก็คือ syntax เองก็ดึงมาจาก Docker registry ด้วย

 
pmc7777 2024-01-16

ว้าว... นี่คือช็อกทางจิตใจครั้งใหญ่ที่สุดของปีเลย 5555555555

 
arfwene 2024-01-15

เป็นวิธีที่น่าสนุกดีนะ

 
bbulbum 2024-01-15

555.. ไอเดียสดใหม่จริง ๆ นะ

 
sagee 2024-01-15

ว้าว... อันนี้สดใหม่ดีนะครับ/ค่ะ เหมือนกับการค้นพบการผสมกันของเหล็กเสริมกับคอนกรีต... ก็อาจจะเวอร์ไปหน่อย แต่ชอบเลยครับ/ค่ะ
พอ #! ดันไปตรงจังหวะกับการที่ใน Dockerfile เครื่องหมาย # เป็นคอมเมนต์พอดี เลยทำให้ลูกเล่นแบบนี้ใช้ได้สินะ...
ต่อไปคงต้องใส่ไว้ใน Dockerfile แทนไฟล์แยกอย่าง build-run-test.sh อะไรทำนองนั้นแล้วล่ะครับ/ค่ะ

 
xguru 2024-01-15

อันนี้น่าสนุกดีนะครับ 5555 "ทำไมถึงไม่ควรใช้ล่ะ?"

 
GN⁺ 2024-01-15
ความคิดเห็นจาก Hacker News
  • ตัวอย่างการใช้ shebang ของ nix-shell

    • อธิบายวิธีใช้ shebang ของ nix-shell เพื่อสร้างสคริปต์ที่รันได้ซึ่งรวม dependency ที่จำเป็นทั้งหมดไว้
    • ยกตัวอย่างสคริปต์ Python สำหรับย่อขนาดภาพลง 50%
    • เมื่อให้สิทธิ์รันกับสคริปต์แล้ว (chmod +x) ก็จะกลายเป็นไฟล์ที่รันได้พร้อม dependency ที่ระบุไว้
  • ตัวเลือก -S / --split-string ของ /usr/bin/env

    • อธิบายตัวเลือก -S ที่ใช้ได้ตั้งแต่ GNU Coreutils 8.30
    • ตัวเลือกนี้อาศัยพฤติกรรมที่ไม่เป็นมาตรฐาน และทำงานได้เฉพาะบนระบบปฏิบัติการที่ปฏิบัติกับข้อความทั้งหมดเป็นอาร์กิวเมนต์ของไฟล์รัน
    • พฤติกรรมที่ไม่เป็นมาตรฐานนี้ใช้ได้กับ GNU/Linux, BSDs และ macOS สมัยใหม่ส่วนใหญ่
  • Docker และความเข้ากันได้ของสถาปัตยกรรม

    • ชี้ว่าในความเป็นจริง Docker ต้องใช้ Linux VM บนแพลตฟอร์มอื่นที่ไม่ใช่ Linux
    • แม้ Linux container จะยอดเยี่ยม แต่ก็ยากจะมองว่า Docker เป็นโซลูชันข้ามแพลตฟอร์มอย่างแท้จริง
  • ความเห็นเกี่ยวกับแอปพลิเคชันไฟล์เดียว

    • ชื่นชมแนวคิดการบรรจุแอปพลิเคชันทั้งหมดไว้ในไฟล์เดียว
    • วิจารณ์ความซับซ้อนของ Docker และตั้งคำถามถึงการใช้ container เพื่อเหตุผลด้านความปลอดภัยหรือการจัดการเวอร์ชัน
    • ตั้งคำถามว่า WebAssembly (WASM) จะแก้ปัญหาเหล่านี้ได้หรือไม่
  • กล่าวถึง Podman และ bubblewrap ในฐานะทางเลือกของ Docker

    • ระบุว่าการใช้ Podman หรือ bubblewrap อาจดีกว่า Docker
    • Podman พึ่งพา distribution บางแบบมากกว่า และ bubblewrap อาจไม่ถูกรวมอยู่ในบาง distribution เพราะปัญหาด้านความปลอดภัย
  • โปรเจ็กต์ไฟล์เดียวที่ใช้ heredocs

    • แม้ไม่มี clever shebang ก็สามารถสร้างโปรเจ็กต์ไฟล์เดียวสำหรับภาษาใดก็ตามหรือโครงสร้างพื้นฐานแบบใดก็ได้ด้วย heredocs
    • ยกตัวอย่างแอปเดียวกันที่แพ็กเป็นสคริปต์ bash
  • วิจารณ์ความยึดติดกับคำว่า "ไฟล์เดียว"

    • ชี้ว่าแทนที่จะรวมทุกอย่างไว้ในไฟล์เดียว ก็สามารถใช้ไดเรกทอรีเพื่อสร้างแอปพลิเคชันแบบ self-contained ได้
    • ระบุว่าการทำให้เป็นไฟล์เดียวไม่ได้แปลว่าจะดีกว่าเสมอไป
  • แพตเทิร์นสคริปต์ที่บริโภคตัวเอง

    • อธิบายวิธีฝังสคริปต์ของอินเทอร์พรีเตอร์อื่นไว้ในสคริปต์ และใช้ sed ดึงสคริปต์ระหว่างแท็กออกมา
    • ยอมรับว่าวิธีนี้บางครั้งมีประโยชน์มาก แต่ก็อาจซับซ้อนได้
  • วิธีใช้ guix shell ตำแหน่ง shebang

    • ยกตัวอย่างการใช้ guix shell ที่นำมาจากคู่มือของ Guix
    • ทำงานร่วมกับไฟล์ manifest ที่ใช้ระบุสภาพแวดล้อมที่ซับซ้อนกว่าได้
  • Dockerfile ที่ build และรันตัวเองได้

    • อธิบาย Dockerfile ที่ build และรันตัวเองได้ซึ่งเขียนไว้ในเดือนพฤศจิกายน 2021 พร้อมยกตัวอย่างโค้ด