0

docker-entrypoint.sh là gì? "Nhạc trưởng" điều phối khởi động bên trong Docker Container

Chào anh em!

Khi làm việc với Docker, chắc chắn anh em đã từng nhìn thấy hoặc tự tay viết một tập tin có tên là docker-entrypoint.sh (hoặc đôi khi chỉ gọi đơn giản là entrypoint script). Nó thường nằm ngay tại thư mục gốc của dự án hoặc bên trong các image Docker chính thức như MySQL, PostgreSQL, Redis, hay Node.js.

Vậy tập tin có cái tên lạ tai này thực chất dùng để làm gì và tại sao các kiến trúc sư DevOps lại coi nó là "vũ khí tối thượng" khi đóng gói ứng dụng? Hãy cùng mổ xẻ ngay sau đây nhé!

1. docker-entrypoint.sh thực chất là gì?

Hiểu một cách đơn giản, docker-entrypoint.sh là một file script Shell (Bash) đóng vai trò là điểm vào duy nhất (Entrypoint) khi một Docker Container được khởi động.

Khi bạn chạy lệnh docker run hoặc docker-compose up, thay vì để Docker gọi trực tiếp ngay câu lệnh khởi chạy ứng dụng (ví dụ: php artisan serve hay node index.js), nó sẽ đi qua file docker-entrypoint.sh trước. File này sẽ thực hiện một loạt các công việc chuẩn bị, dọn dẹp, kiểm tra môi trường, rồi sau đó mới chính thức "bật công tắc" cho phép ứng dụng chạy.

2. Tại sao chúng ta bắt buộc phải dùng Entrypoint Script trong các dự án lớn?

Trong môi trường container hóa, một Container sinh ra phải có tính độc lập cao và sẵn sàng chạy ở bất cứ đâu. Tuy nhiên, trước khi ứng dụng thực sự cất cánh, nó thường đòi hỏi các bước chuẩn bị phức tạp mà một câu lệnh Dockerfile thông thường (CMD) không thể làm hết được. Đó là lúc docker-entrypoint.sh ra tay:

A. Chạy tự động các tiến trình di chuyển Database (Database Migrations & Seedings)

Khi deploy một hệ thống Backend (như Laravel hoặc Node.js) lên Kubernetes hoặc Docker Swarm, Container ứng dụng và Container Database khởi động gần như cùng một lúc.

  • Vấn đề: Ứng dụng chạy lên trước khi Database kịp mở cổng kết nối sẽ dẫn đến lỗi sập nguồn (Connection Refused).
  • Giải pháp trong script: File docker-entrypoint.sh có thể viết vòng lặp until để kiểm tra xem Database đã sẵn sàng chưa, sau đó tự động chạy lệnh php artisan migrate --force trước khi cho phép ứng dụng chính khởi động.

B. Thiết lập cấu hình động từ biến môi trường (Environment Variables Processing)

Nhiều ứng dụng đòi hỏi phải sinh ra file cấu hình (.env hoặc nginx.conf) dựa trên các biến môi trường (Environment Variables) được truyền vào từ bên ngoài lúc container khởi chạy. Script này sẽ đóng vai trò đọc các biến đó, điền vào template cấu hình rồi mới khởi động service.

C. Xử lý phân quyền tệp (File Permissions Fixing)

Trên các hệ điều hành Linux, các thư mục lưu trữ file tải lên (như storage hay public/uploads) đôi khi bị lệch quyền đọc/ghi giữa user bên ngoài máy host và user chạy ứng dụng bên trong container. Đoạn script entrypoint có thể tự động chạy lệnh chown hoặc chmod vào lúc khởi động để triệt tiêu hoàn toàn các lỗi ghi file.

3. Cấu trúc kinh điển của một file docker-entrypoint.sh

Một file entrypoint tiêu chuẩn thường có cấu trúc cơ bản như sau:

#!/bin/bash
set -e

echo "==> Đang kiểm tra kết nối tới cơ sở dữ liệu..."
while ! nc -z db_host 3306; do
  sleep 1
done
echo "==> Database đã sẵn sàng!"

echo "==> Đang chạy Migration..."
php artisan migrate --force

echo "==> Khởi động ứng dụng chính..."
# Câu lệnh "$@" dùng để tiếp nhận và thực thi mọi tham số truyền vào từ Dockerfile hoặc docker-compose
exec "$@"

Điểm mấu chốt cuối cùng (exec "$@"): Dòng lệnh này cực kỳ quan trọng. Nó giúp thay thế tiến trình của Shell script bằng tiến trình chính của ứng dụng (ví dụ: PHP-FPM hoặc Node). Nhờ đó, ứng dụng của bạn sẽ nhận được trực tiếp tín hiệu SIGTERM từ Docker khi bạn muốn dừng container, giúp quá trình tắt máy diễn ra an toàn (Graceful Shutdown) mà không bị kẹt tiến trình ngầm.

Lời kết

docker-entrypoint.sh giống như một người quản đốc tận tụy, chuẩn bị sẵn sàng mọi thứ ngăn nắp, sạch sẽ trước khi trao lại quyền điều hành cho ứng dụng chính bên trong Docker Container. Nắm vững cách viết và sử dụng script này sẽ giúp các hệ thống Backend của bạn tự động hóa hoàn toàn và vận hành vô cùng bền bỉ trên mọi môi trường!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí