15 điểm bởi GN⁺ 2024-01-15 | 7 bình luận | Chia sẻ qua WhatsApp

#! là gì?

  • #! (đọc là shebang) là một quy ước trên Unix, chủ yếu được dùng cho các ngôn ngữ script như Python hoặc Bash
  • Giới thiệu một ví dụ sử dụng nó để đóng gói cách phân phối ứng dụng đa nền tảng và trên nhiều bản phân phối Linux thành một tệp duy nhất
  • Dockerfile ví dụ cấu thành một máy chủ full-stack hoàn chỉnh, bao gồm backend, cơ sở dữ liệu và UI, tất cả trong một tệp duy nhất
  • Tương tự Cosmopolitan Libc, nhưng dành cho việc đóng gói ứng dụng

Tại sao lại dùng?

  • Sao lại không dùng chứ?

Có an toàn không?

  • Có lẽ là không.

Có nên dùng không?

  • Nếu muốn thì có thể dùng.

Hiệu năng có tốt không?

  • Có khả năng là có.

Có dễ bảo trì không?

  • Không.

Nó có hoạt động không?

  • Có.

Chạy như thế nào?

  • Có thể chạy bằng lệnh sau: chmod +x ./Dockerfile ./Dockerfile
  • Sau đó truy cập địa chỉ http://127.0.0.1:8080.

Ý kiến của GN⁺

  • Bài viết này giới thiệu một cách tiếp cận độc đáo: dùng #! (shebang) để đóng gói một máy chủ full-stack vào trong một Dockerfile duy nhất.
  • Nó khơi gợi sự tò mò về mặt kỹ thuật và đưa ra một hướng tiếp cận mới cho cách triển khai ứng dụng truyền thống.
  • Dù không được khuyến nghị về mặt bảo trì và độ ổn định, cách làm này vẫn có thể là một lựa chọn thú vị cho các lập trình viên quan tâm đến những dự án mang tính thử nghiệm và đổi mới.

7 bình luận

 
minhoryang 2024-01-17

Để dùng heredoc như <<EOF, cần có # syntax = docker/dockerfile:1.4.0 ở đầu Dockerfile. Điều đáng ngạc nhiên là cả syntax cũng được lấy từ Docker registry.

 
pmc7777 2024-01-16

Wow... đây là cú sốc tinh thần lớn nhất của tôi trong năm nay luôn đó hahahahaha

 
arfwene 2024-01-15

Một cách khá thú vị.

 
bbulbum 2024-01-15

Haha... đúng là mới lạ thật.

 
sagee 2024-01-15

Wow.. cái này thật mới lạ. Cảm giác như phát hiện ra sự kết hợp giữa thép cây và bê tông vậy.. nói thế thì hơi quá nhưng đúng là hay.
Hóa ra đúng lúc #! trong Dockerfile lại hoạt động được nhờ # là ký tự chú thích, nên kiểu mẹo này mới dùng được..
Từ giờ chắc phải đưa vào Dockerfile thay vì tách riêng các file kiểu build-run-test.sh nữa rồi.

 
GN⁺ 2024-01-15
Ý kiến trên Hacker News
  • Ví dụ sử dụng shebang nix-shell

    • Giải thích cách dùng shebang nix-shell để tạo một script có thể thực thi, bao gồm mọi dependency cần thiết.
    • Cung cấp ví dụ một script Python thu nhỏ ảnh xuống 50%.
    • Khi cấp quyền thực thi cho script (chmod +x), nó sẽ trở thành một tệp thực thi với các dependency đã chỉ định.
  • Tùy chọn -S / --split-string của /usr/bin/env

    • Giải thích về tùy chọn -S, khả dụng từ GNU Coreutils 8.30.
    • Tùy chọn này dựa vào hành vi không theo chuẩn và chỉ hoạt động trên các HĐH xử lý toàn bộ văn bản như đối số của tệp thực thi.
    • Hành vi không chuẩn này hoạt động trên hầu hết các hệ GNU/Linux hiện đại, BSD và macOS.
  • Docker và khả năng tương thích kiến trúc

    • Chỉ ra rằng trên các nền tảng không phải Linux, Docker thực tế vẫn cần một Linux VM.
    • Container Linux rất tốt, nhưng khó coi Docker là một giải pháp cross-platform đúng nghĩa.
  • Ý kiến về ứng dụng một tệp duy nhất

    • Bày tỏ sự tán thưởng với ý tưởng đóng gói toàn bộ ứng dụng trong một tệp duy nhất.
    • Phê phán độ phức tạp của Docker và đặt câu hỏi về việc dùng container cho mục đích bảo mật hay quản lý phiên bản.
    • Đặt câu hỏi liệu WebAssembly (WASM) có thể giải quyết những vấn đề này hay không.
  • Nhắc đến Podman và bubblewrap như lựa chọn thay thế Docker

    • Đề cập rằng dùng Podman hoặc bubblewrap thay cho Docker có thể tốt hơn.
    • Podman phụ thuộc nhiều hơn vào một số bản phân phối cụ thể, còn bubblewrap có thể không được đưa vào một số bản phân phối do vấn đề bảo mật.
  • Dự án một tệp dùng heredoc

    • Ngay cả khi không có shebang khéo léo, vẫn có thể tạo dự án một tệp cho bất kỳ ngôn ngữ hay hạ tầng nào bằng heredoc.
    • Cung cấp ví dụ về cùng một ứng dụng được đóng gói dưới dạng script bash.
  • Phê phán sự ám ảnh với "một tệp duy nhất"

    • Chỉ ra rằng thay vì đóng gói mọi thứ vào một tệp, có thể dùng thư mục để tạo ứng dụng tự chứa.
    • Nhắc rằng việc biến mọi thứ thành một tệp chưa chắc đã là cách tốt hơn.
  • Mẫu script tự tiêu thụ

    • Giải thích cách nhúng script của một trình thông dịch khác bên trong script, rồi dùng sed để trích xuất script nằm giữa các thẻ.
    • Thừa nhận rằng cách này đôi khi rất hữu ích, nhưng có thể trở nên phức tạp.
  • Cách dùng guix shell ở vị trí shebang

    • Cung cấp ví dụ dùng guix shell lấy từ tài liệu hướng dẫn của Guix.
    • Hoạt động cùng một tệp manifest để chỉ định môi trường phức tạp hơn.
  • Dockerfile tự build và tự chạy

    • Cung cấp mô tả và ví dụ mã cho một Dockerfile có thể tự build và tự chạy, được viết vào tháng 11 năm 2021.